NSOperation之间可以设置依赖来保证执行顺序
比如一定要让操作A执行完后,才能执行操作B,可以这么写:
[operationB addDependency:operationA]; // 操作B依赖于操作A
同时可以在不同queue的NSOperation之间创建依赖关系 不允许相互依赖
模拟软件升级过程:下载—解压—升级完成, 示例代码:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController{
NSOperationQueue *_queue; // 队列
}
- (void)viewDidLoad {
[super viewDidLoad];
_queue = [[NSOperationQueue alloc] init]; // 实例化
}
// 模拟软件升级过程: 下载 —> 解压 —> 升级完成
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// 创建操作: 下载,解压,升级
NSBlockOperation *download = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载(%@)",[NSThread currentThread]);
}];
NSBlockOperation *decoding = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"解压(%@)",[NSThread currentThread]);
}];
NSBlockOperation *update = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"升级(%@)",[NSThread currentThread]);
}];
// 设置依赖关系
[decoding addDependency:download]; // 解压依赖于下载
[update addDependency:decoding]; //升级依赖于解压
// 将操作添加到队列中 (同一队列内的操作设置依赖关系)
// [_queue addOperations:@[download,decoding,update] waitUntilFinished:NO];
// 不同队列之间也可以设置依赖关系
[_queue addOperations:@[download,update] waitUntilFinished:NO];
[[NSOperationQueue mainQueue] addOperation:decoding];
}
@end
结论:
除了相同队列中的操作可以设置依赖关系外,不同队列间的操作依赖关系同样生效