若不将NSOperation对象添加到NSOperationQueue中,操作只会在当前线程执行,且需要手动开始执行操作
NSoperation的子类
NSInvocationOperation
//创建操作 NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil]; //开始执行操作 [operation start];
NSBlockOperation(当操作数大于1时,异步执行)
//创建操作 NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ //操作封装的任务代码 }]; //添加操作 [operation addExecutionBlock:^{ //操作封装的任务代码 }]; //开始执行操作 [operation start];
自定义子类的步骤
设置操作完成时的回调
//创建操作 NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ //任务代码 }]; //设置回调 operation.completionBlock = ^{ //操作完成时执行的代码 };
作用
NSOperationQueue的相关操作
创建操作队列
获取主操作队列
获取当前操作队列
往队列中添加操作
设置最大并发操作数
暂停/启动队列中的任务
取消队列中的任务
创建操作队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]
往队列中添加操作
/** 方法一 */ //创建操作 NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil] //download为操作封装的任务方法 NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ //任务代码 }]; //添加操作 [queue addOperation:operation1]; [queue addOperation:operation2]; /** 方法二 */ //添加操作 [queue addOperationWithBlock:^{ //操作封装的任务 }];
作用
建立操作依赖的步骤
创建操作队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]
添加操作
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ //任务1代码 }]; NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ //任务2代码 }];
建立依赖关系(必须在操作被添加到队列之前)
[operation1 addDependency:operation2];
将操作添加到队列
[queue addOperation:operation1]; [queue addOperation:operation2];
从主线程到子线程
从子线程到主线程
将需要执行的操作,添加到主操作队列中即可(该操作将运行在主runLoop的common模式下)
[[NSOperationQueue mainQueue] addOperationWithBlock:^{ //需要在主线程中执行的任务代码 }];