多线程之NSOperationQueue(线程队列)

来源:互联网 发布:局域网屏幕广播软件 编辑:程序博客网 时间:2024/06/10 20:38

NSOperationQueue的使用

OperationQueue 相比 GCD的优势:

  • 1.可以设置依赖关系
  • 2.队列可以暂停
  • 3.可以取消队列中的操作

NSOpertionQueue NSOperation
Queue
主队列 和 自定义队列
主队列是运行在主线程当中,自定义队列运行在后台

NSOperation 定义需要执行的操作(任务)
定义需要的操作,然后把该操作添加到合适的队列中
- 1.创建队列对象
- 2.创建操作对象
- 3.把操作对象添加到队列之中,等待队列分配线程执行操作

1.创建队列

 NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//最大并发操作数    //队列中最多有几个操作同时执行    queue.maxConcurrentOperationCount = 1;   //暂停执行队列中的线程   // [queue setSuspended:YES];

2.创建操作

 //NSOperation 不能直接使用    //使用子类的对象//    NSOperation *operation = [[NSOperation alloc] init];    NSOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self                                                            selector:@selector(thread1:)                                                              object:@"op1 "];    NSOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self                                                            selector:@selector(thread2:)                                                              object:@"op2 "];    NSBlockOperation *op3 = [[NSBlockOperation alloc] init];    [op3 addExecutionBlock:^{        for (int i = 0; i < 10; i++) {            NSLog(@"OP1 ----- %d", i);            sleep(1);        }    }];    NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{        for (int i = 0; i < 10; i++) {            NSLog(@"OP4 ------------ %d", i);            sleep(1);        }    }];

3.把操作加入到队列中

//加入之后,如果有操作,那队列就会自动执行    [queue addOperation:op1];    [queue addOperation:op2];    [queue addOperation:op3];    [queue addOperation:op4];

4.设置操作的优先级

    [op1 setQueuePriority:NSOperationQueuePriorityLow];    [op2 setQueuePriority:NSOperationQueuePriorityNormal];    [op3 setQueuePriority:NSOperationQueuePriorityHigh];    [op4 setQueuePriority:NSOperationQueuePriorityVeryHigh];

5.设置操作之间的依赖关系

  • (1)加入队列中时间
  • (2)优先级
  • (3)依赖关系 (明确指定操作的执行顺序)
[op2 addDependency:op1];    //op2的执行依赖于op1,保证op1肯定op2之前执行
//重新让队列执行 [queue setSuspended:NO];

6.取消所有的操作 不能取消正在执行的操作

 sleep(3);    [queue cancelAllOperations]; //取消一个操作    [op3 cancel];

6.与此同时主线程也在运行:

for (int i = 0; i < 50; i ++)    {        NSLog(@"主线程 : %d", i);    }
- (void)thread1:(NSString *)name{    //具体要执行的操作    for (int i = 0; i < 50; i ++) {        NSLog(@"多线程 %@:     %d", name, i);    }}- (void)thread2:(NSString *)name{    for (int i = 0; i < 50; i ++) {        NSLog(@"多线程 %@:     %d", name, i);    }}@end
3 0
原创粉丝点击