多线程-NSOperation设置依赖关系

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 *)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

结论:
除了相同队列中的操作可以设置依赖关系外,不同队列间的操作依赖关系同样生效

你可能感兴趣的:(多线程-NSOperation设置依赖关系)