设为首页 加入收藏

TOP

多线程之NSOperation和NSOperationQueue(二)
2017-10-13 10:29:13 】 浏览:4389
Tags:线程 NSOperation NSOperationQueue
>{number = 3, name = (null)},是否主线程:NO

  可以从上面的执行结果中,很容易的发现,程序是并行的执行。而创建的操作,也就是:Line4是在主线程中执行,而其他通过通过 addExecutionBlock 方法添加的Block操作则是在不同的线程中执行。

  通过上面的说明,我要总结的是:NSOperation以及子类,只是一个操作,本身无主线程和子线程的区分,可以在任意线程中使用。也就是,在主线程中创建的操作将在主线程中执行,在子线程中创建的操作将在子线程中执行。而实现多线程可以配合NSOperationQueue来实现。下面来介绍NSOperationQueue。

  2.NSOperationQueue,是操作队列,它用来管理一组NSOperation对象的执行,会根据需要自动为NSOperation对象开辟适合数量的线程,以完成任务的并行执行。下面上代码:

 1 - (void)operationQueue {
 2     //创建一个任务队列,alloc(new)出来的任务队列将会在子线程中执行,并且是并发执行
 3     NSOperationQueue *queue = [[NSOperationQueue alloc] init];
 4     //创建操作NSInvocationOperation
 5     for (int i = 0; i < 5; i++) {
 6         NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(startOpration) object:nil];
 7         [queue addOperation:operation];
 8     }
 9     //创建NSBlockOperation操作
10     for (int i = 0; i < 5; i++) {
11         NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
12             NSLog(@"%d,%@,%d", __LINE__, [NSThread currentThread], [NSThread isMainThread]);
13         }];
14         //将操作添加到队列中
15         [queue addOperation:blockOperation];
16     }
17     //设置最大并发数,当把最大并发数设置1时,此时队列相当于串行执行。
18     queue.maxConcurrentOperationCount = 3;
19     //添加依赖关系
20     NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
21         NSLog(@"这是任务1,依赖于任务2");
22     }];
23     NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
24         NSLog(@"这是任务2");
25     }];
26     //添加依赖关系
27     //添加依赖关系时,注意不能添加互相依赖,如A依赖B,B依赖A
28     [op1 addDependency:op2];
29     //添加依赖关系必须在任务添加到队列之前设置
30     [queue addOperation:op1];
31     [queue addOperation:op2];
32     //回到主线程的操作
33     [[NSOperationQueue mainQueue] addOperationWithBlock:^{
34         NSLog(@"%d,%@,%d", __LINE__, [NSThread currentThread], [NSThread isMainThread]);
35     }];
36 }

  下面是执行的结果:

 1 2016-05-06 21:15:11.625 NSOperation[1770:402666] 开始执行,是否主线程:NO
 2 2016-05-06 21:15:11.625 NSOperation[1770:402633] 开始执行,是否主线程:NO
 3 2016-05-06 21:15:11.625 NSOperation[1770:402642] 开始执行,是否主线程:NO
 4 2016-05-06 21:15:11.625 NSOperation[1770:402654] 开始执行,是否主线程:NO
 5 2016-05-06 21:15:11.625 NSOperation[1770:402664] 开始执行,是否主线程:NO
 6 2016-05-06 21:15:11.626 NSOperation[1770:402665] 75,<NSThread: 0x7f852bc099f0>{number = 2, name = (null)},0
 7 2016-05-06 21:15:11.627 NSOperation[1770:402667] 75,<NSThread: 0x7f852bf0db10>{number = 3, name = (null)},0
 8 2016-05-06 21:15:11.628 NSOperation[1770:402633] 75,<NSThread: 0x7f852bc46ee0>{number = 4, name = (null)},0
 9 2016-05-06 21:15:11.628 NSOperation[1770:402666] 75,<NSThread: 0x7f852bc4fe00>{number = 6, name = (null)},0
10 2016-05-06 21:15:11.628 NSOperation[1770:402642] 75,<NSThread: 0x7f852be0a130>{number = 5, name = (null)},0
11 2016-05-06 21:15:11.629 NSOperation[1770:402633] 这是任务2
12 2016-05-06 21:15:11.629 NSOperation[1770:402633] 这是任务1,依赖于任务2
13 2016-05-06 21:15:11.631 NSOperation[1770:402393] 97,<NSThread: 0x7f852bd05190>{number = 1, name = main},1

  从上面的执行结果中,我们可以得到几个结论:1.首先队列中的任务都是在子线程中执行的;2.队列中的任务是并发执行的。而常用到的添加依赖关系,以及操作完成之后回到主线程的方法在上面的代码中都有体现。

  需要说明的是,一旦将operation添加到队列中后,队列就拥有了这个操作,操作将不能从队列中删除,只能取消一个操作,或者取消所有的操作。取消一个操作的方法:

[operation cancel];

  取消所有操作的方法:

[queue cancelAllOperations];

  如果想要暂停操作

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇打电话、发短信、web以及发邮件 下一篇学习ios【2】Objective-C 数字和..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目