多线程之NSOperationQueue(线程队列)

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。