多线程19——NSOperation操作依赖和操作监听
一、NSOperation操作依赖
NSOperation 之间可以设置依赖来保证执行顺序
比如一定要让操作A 执行完后,才能执行 操作B,可以这么写
[operationB addDependency:operationA]; // 操作B依赖于操作A
可以在不同 queue 的 NSOperation 之间创建依赖关系
二、NSOperation操作监听
- (void (^)(void))completionBlock;
- (void)setCompletionBlock:(void (^)(void))block;
三、代码示例
下面的代码中
操作1 依赖于 操作4
操作2 依赖于 操作3
那么我们可以提前知道结果应该是
操作1 在操作4 后执行
操作2 在操作3 后执行
操作1 和 操作2 可能是操作1先执行,也能是操作2执行
操作3 和 操作4 可能是操作3先执行,也能是操作4执行
那么上面的结果其实就 4 四种
如下
可能结果 1
操作3
操作4
操作1
操作2
可能结果 2
操作3
操作4
操作2
操作1
可能结果 3
操作4
操作3
操作1
操作2
可能结果 4
操作4
操作3
操作2
操作1
//
// QWMViewController4.m
// 03_UIview85多线程_NSOperation
//
// Created by 杞文明 on 17/9/4.
// Copyright © 2017年 杞文明. All rights reserved.
//
// 依赖
#import "QWMViewController4.h"
@interface QWMViewController4 ()
@end
@implementation QWMViewController4
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self test];
}
-(void)test{
//1.创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
NSOperationQueue *queue2 = [[NSOperationQueue alloc]init];
//2.封装操作
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"1---%@",[NSThread currentThread]);
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"2---%@",[NSThread currentThread]);
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"3---%@",[NSThread currentThread]);
}];
NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"4---%@",[NSThread currentThread]);
}];
//操作监听
op3.completionBlock = ^{
NSLog(@"++++++完啦-----%@",[NSThread currentThread]);
};
//添加操作依赖
//注意点:不能循环依赖
//可以跨队列依赖
[op1 addDependency:op4];
[op2 addDependency:op3];
//添加操作到到队列中
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];
[queue2 addOperation:op4];
}
@end
四、运行结果
[28848:144530] 3---<NSThread: 0x600000079240>{number = 3, name = (null)}
[28848:144526] 4---<NSThread: 0x600000078d00>{number = 4, name = (null)}
[28848:144530] 2---<NSThread: 0x600000079240>{number = 3, name = (null)}
[28848:144527] 1---<NSThread: 0x6080000789c0>{number = 5, name = (null)}
[28848:144526] ++++++完啦-----<NSThread: 0x600000078d00>{number = 4, name = (null)}