基本使用
NSInvocationOperation
NSInvocationOperation op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task) object:nil];
// 创建队列
/
GCD:
串行类型: create & 主队列
并发类型: create & 全局并发队列
NSOperation:
主队列(串行队列): [NSOperationQueue MainQueue] 和 GCD主队列一样
非主队列: [[NSOperationQueue alloc] init] 非常特殊(同时具备并发和串行的功能) (默认情况下是并发队列)
*/
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 将操作添加到队列中
[queue addOperation:op]; // 内部已经调用了start方法-
NSBlockOperation
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
}];
// 追加任务 (一个操作对象包含一个以上任务 可能会开启子线程并发执行任务)
[op addExecutionBlock:^{
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:op];// 简便方法 [queue addOperationWithBlock:^{ }];
-
自定义NSOperation
// 自定义操作类继承自NSOperation 重写main方法
#import "SWOperation.h"
@implementation SWOperation
// 要执行的任务
-(void)main
{
}
@end// 调用该自定义操作类 即可实现并发操作 SWOperation *op = [[SWOperation alloc] init]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:op];
NSOperation其他用法(暂停/恢复/取消/最大并发数)
最大并发数(默认值为-1,表示最大值)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 最大并发数(同一时间最多有多少个任务可以执行) 并发数为1时为串行执行(注:串行不代表只开一条线程)
queue.maxConcurrentOperationCount = 1;-
暂停/恢复/取消
// 暂停 (不能暂停当前正在执行的任务 暂停后队列中未执行的任务会停止执行)
queue.suspended = YES;
// 恢复
queue.suspended = NO;
// 取消
[queue cancelAllOperations];// 自定义类的暂停/恢复/取消 #import "SWOperation.h" @implementation SWOperation // 要执行的任务 -(void)main { for (int i = 0; i < 1000; i++) { NSLog(@"download1---%d---%@",i,[NSThread mainThread]); } // 点击取消 会自动调用cancel方法 判断是否取消 若取消 则退出 if (self.isCancelled) { return; } for (int i = 0; i < 1000; i++) { NSLog(@"download1---%d---%@",i,[NSThread mainThread]); } } @end
操作依赖
// 操作1依赖于操作2 (不能循环依赖)
// 可以跨队列依赖
[op1 addDependency:op2];操作监听
// 操作监听
[op1 setCompletionBlock:^{
// op1操作执行完毕
}];
NSOperation线程间通讯
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
// 执行耗时操作
// 回主线程更新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// 更新UI
}];
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:op];