这是我参与「第四届青训营 」笔记创作活动的第4天
1、简介
- NSOperation是一个抽象类
- 不能直接使用(方法没有实现)
- 约束子类都具有共同的属性和方法
- NSOperation的子类
- NSInvocationOperation
- NSBlockOperation
- 自定义operation
- NSOperationQueue队列
- 步骤
- 先将需要执行的操作封装到一个NSOperation对象中
- 然后将NSOperation对象添加到NSOperationQueue队列中
- 系统会自动将NSOperationQueue中的NSOperation取出来
- 将取出的NSOperation封装的操作放到一条新线程中执行
2、NSInvocationOperation
- 不开启新线程
//创建操作
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo) object:nil];
//直接执行操作 不开启新线程
[op start];//不开启新线程
- 开启新线程
//创建操作
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo) object:nil];
//创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//把操作添加到队列 开启子线程
[queue addOperation:op];
3、NSBlockOperation
//创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//创建操作
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog("");
}];
//将操作添加到队列中
[queue addOperation:op];
4、线程间通信
//创建操作
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog("异步下载图片"); //子线程
//获取当前的队列
[NSOperationQueue currentQueue];
//回到主线程更新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog("更新UI");
}];
}];
5、最大并发数
- 最大并发数并不是线程数,而是指队列中同一时间同时能执行几个操作
- 最大并发数是队列中的属性
_queue.maxConcurrentOperationCount = 2; //该队列同时执行最多两个操作,但是线程开启数可能会更多
6、队列的暂停、取消、恢复
- 取消队列所有操作是一个方法
- (void)cancelAllOperations;
- 暂停和恢复队列 是队列中的属性
- (void)setSuspended:(BOOL)b; //YES代表暂停队列,NO代表恢复队列- (BOOL)isSuspended;
//取消所有操作 [self.queue cancelAllOperations]; //暂停操作 self.queue.suspended = YES; //继续操作 self.queue.suspended = NO; ```
7、操作的优先级(服务质量)
- 队列中有多个操作,操作的优先级越高在队列中被调用的几率越高
op1.qualityOgService = NSQualityOfServiceUserInteractive;
8、操作依赖
- NSOperation之间可以设置依赖来保证执行顺序
- 让操作A执行完了之后,才能执行操作B
[operationB addDependency:operationA];//操作B依赖操作A
- 可以在不同的队列中的NSOperation中创建依赖关系
9、NSOperation和GCD的区别
- GCD
- 一次性执行
- 延迟执行
- 调度组
- NSOperation
- 最大并发数
- 队列的暂停/继续
- 取消所有操作
- 取消操作直接的依赖关系