多线程使用(三)NSOperation的基本使用

一、NSOperation 和 NSOperationQueue 概念
 
1、NSOperation 相当于 GCD 的任务,NSOperationQueue 相当于 GCD 的队列
2、将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加到NSOperationQueue中 ,系统自动将NSOperationQueue中的NSOperation取出来 放到一条新线程中执行
 
3、NSOperation 是抽象类,应该使用它的子类创建对象,一般使用它的2个子类:NSInvocationOperation、 NSBlockOperation ,或者自定义继承自 NSOperation 的子类来使用
 
二、NSInvocationOperation 、 NSBlockOperation 的使用
 
当 NSInvocationOperation 、 NSBlockOperation 封装的操作没有添加到 NSOperationQueue 队列中而直接执行时,默认是在主线程中同步执行的。
 
1、NSInvocationOperation 默认情况下,不使用 NSOperationQueue 时并不会开一条新线程去执行操作,而是在当前线程同步执行操作 :
 
1     //创建一个 NSInvocationOperation 对象
2     NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
3  
4     //执行操作,没有使用队列默认同步执行
5     [operation2 start];

 

 
2、NSBlockOperation 默认情况下也还是在主线程中同步执行:
 
1   // 使用 NSBlockOperation 封装操作
2     NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
3         NSLog(@“------%@", [NSThread currentThread]);
4     }];
5  
6   //执行操作
7     [operation start];

 

 
但是,当 NSBlockOperation 中封装了多个操作时,会自动开启多线程,向 中添加操作的方法是:
 
1     // NSBlockOperation 再次封装一个操作
2     [operation addExecutionBlock:^{
3         NSLog(@"---%@", [NSThread currentThread]);
4     }];
5    
6     // NSBlockOperation 再次封装一个操作
7     [operation addExecutionBlock:^{
8         NSLog(@"---%@", [NSThread currentThread]);
9     }];

 

 
这时候一个 NSBlockOperation 中就有了 3 个操作,会自动再开启2个子线程来执行
 
三、 NSOperationQueue 的使用
 
当 NSInvocationOperation 、 NSBlockOperation 封装的操作添加到 NSOperationQueue 队列,通过队列执行时,是异步(开启新线程)执行的。
 
1、将封装好的 NSInvocationOperation 、 NSBlockOperation 对象放到 NSOperationQueue 队列中,不需要调用 start 方法,它会自动执行,而且是异步执行:
 
 1  //封装NSInvocationOperation
 2     NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil];
 3     NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
 4  
 5     //封装NSBlockOperation
 6     NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
 7          
 8           NSLog(@"NSBlockOperation------下载图片---%@", [NSThread currentThread]);
 9     }];
10  
11     [operation3 addExecutionBlock:^{
12             NSLog(@"NSBlockOperation------下载图片2---%@", [NSThread currentThread]);
13     }];
14  
15     //创建队列
16     NSOperationQueue *queue = [[NSOperationQueue alloc] init];
17     // 添加操作到队列中,自动执行
18     [queue addOperation:operation1];
19     [queue addOperation:operation2];
20     [queue addOperation:operation3];
21      //使用block方法添加操作
22     [queue addOperationWithBlock:^{
23         NSLog(@"------操作---%@", [NSThread currentThread]);
24     }];

 

 
这里会自动新创建5个子线程来执行操作
 
四、NSOpeation 一些设置
 
1、最大并发数,指同一时刻可以执行的最大任务数,设置:
 
queue.maxConcurrentOperationCount = 2;

 

 
同一时刻可以最多开启 2 个线程来执行任务,注意这里是指的同一时刻而不是程序运行过程中,程序运行中该队列可能开启多个线程但是同一时刻最多有2 个
 
2、操作依赖,设置一个操作只有等到另一个操作执行完成后才能执行,就叫这个操作依赖另一个操作:
 
[operation3 addDependency:operation1];

 

 
操作3依赖操作1,注意,操作添加到队列中的顺序并不能决定他的执行的顺序,只有操作依赖可以决定执行顺序
 
可以再不同队列之间实现依赖
 
3、操作监听,设置一个操作完成后执行某个操作
 
1    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
2          //操作
3     }];
4     operation.completionBlock = ^{
5         //操作完成后想做事情
6     };
7    
8     NSOperationQueue *queue = [[NSOperationQueue alloc] init];
9     [queue addOperation:operation];

 

 
 

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