NSOperation之间可以设置依赖以此来保证线程的执行顺序,而且操作间的依赖也可以跨队列来使用。
我们模拟下软件升级的过程,肯定需要三大步骤,下载,解压,升级完成,我们让升级完成之后去提示用户,所以放到主队列中去执行。废话不多说,直接上代码
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,strong)NSOperationQueue * queue;
@end
@implementation ViewController
-(NSOperationQueue *)queue
{
if(!_queue)
{
_queue=[NSOperationQueue new];
}
return _queue;
}
- (void)viewDidLoad {
[super viewDidLoad];
NSBlockOperation * op1=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载");
}];
NSBlockOperation * op2=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"解压");
}];
NSBlockOperation * op3=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"升级完成");
}];
//设置依赖关系
[op2 addDependency:op1];
[op3 addDependency:op2];
//如果这里循环依赖就什么都不会执行了
//[op1 addDependency:op2];
[self.queue addOperations:@[op1,op2] waitUntilFinished:NO];
//把操作3添加到主队列中,依赖关系还是有作用的
[[NSOperationQueue mainQueue]addOperation:op3];
}