NSOperation 的作用
1.配合使用 NSOperation 和 nsoperationQueue 也能实现多线程编程
注: NSOperation 是一个抽象类,不具备封装操作的能力,需要使用子类
①NSInvocationOperation
②NSBlockOperation
③自定义子类继承 NSOperation 实现内部方法
2.步骤
1>需要的执行操作封装到一个NSOperation 对象中;
2> 然后将 NSOperation 对象添加到NSOperationQueue 中
3>系统会自动将 nsoperationQueue 中的 NSOperation 取出来
4>将取出的 SOperation 封装的操作放到一条新线程中执行;
①NSInvocationOperation
.m
- (void)viewDidLoad {
[super viewDidLoad];
//封装操作 也就是创造操作对象 封装需要操作的任务
NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download ) object:nil];
// 执行操作 start 启动上面的方法 默认主线程
[operation start];
}
- (void)download
{
NSLog(@"123%@",[NSThread currentThread]);
}
//只有放在NSOperationQueue 中才会异步执行
②NSBlockOperation
-(void)blockOperation{
// 1.封装操作
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"1--%@",[NSThread currentThread]);
}];
//通过-(void)addExecutionBlock:(void)(^)bloack; 添加更多操作
[operation addExecutionBlock:^{
NSLog(@"2--%@",[NSThread currentThread]);
}];
[operation addExecutionBlock:^{
NSLog(@"3--%@",[NSThread currentThread]);
}];
// 执行操作
[operation start];
}
注:只有 NSBlockOperation 的封装操作>1 才会开启异步执行
-(void)queue{
//并发对列
//封装操作
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download ) object:nil];
NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector( run ) object:nil];
NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"1--%@",[NSThread currentThread]);
}];
[operation3 addExecutionBlock:^{
NSLog(@"2--%@",[NSThread currentThread]);
}];
//创建队伍
NSOperationQueue *queue=[[NSOperationQueue alloc]init];
// 将操作加入队伍中
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
}
注:
1.取出任务是有顺序的 但是任务是一起进行的
2.不需要加 start 方法
- 队伍的操作
①取消
-(void)cancelAllOperation;
②恢复和暂停队伍
BOOL setSuspended
YES 暂停 NO 恢复
③ 优先级
④操作依赖
① 同一队伍内的NSOperation 可以依靠依赖关系 来保证执行顺序
[operation2 addDependency:operation3];
//操作2 依赖操作1 要等1 做完之后2 才会做
② 在不同对列之间设置依赖 但不能相互依赖
//Error
[operation2 addDependency:operation3];
[operation3 addDependency:operation2];
④ 监听操作
-(void)operationListen{
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"1--%@",[NSThread currentThread]);
}];
operation.completionBlock = ^{
//下载完 之后想做的事情
NSLog(@"下载完毕----%@",[NSThread currentThread]);
};
//创建队伍
NSOperationQueue *queue=[[NSOperationQueue alloc]init];
[queue addOperation:operation];
}