NSOperation
是OC语言中基于GCD的面向对象的封装
使用起来比GCD更简单(面向对象)
提供了一些用GCD不好实现的功能
苹果推荐使用, 使用NSOperation不用关心线程以及线程的生命周期
-
NSOperation是一个抽象类
- 没有实现的类(方法没有实现)
- 用作父类, 用来约束子类
-
NSOperation的子类
-
NSInvocationOperation
- 使用步骤
- 创建NSInvocationOperation对象
- (id)initWithTarget:(id)target selector(SEL)sel object:(id)arg;
- 调用start方法开始执行操作
- (void)start; 一旦曹操执行 就会调用target的sel方法
注意事项:
默认情况下 调用start方法并不会开启新的线程去执行操作 而是在当前线程同步执行操作 只有将NSOperation放到一个NSOperationQueue(队列)中 才会执行异步操作
-
-
NSBlockOperation
- 创建NSBlockOPeration对象
+ (id)blockOperationWithBlock:(void(^)(void))block
- 使用addExecutionBlock添加操作
- (id)addExecutionBlock:(void(^)(void))block
注意事项:
只要NSBlockOperation封装的操作数>1 就会执行异步操作 自定义operation
-
NSOperationQueue队列
主队列
添加到主队列的操作, 最终都执行在主线程上
[NSOperationQueue mainQueue];
当前队列
获取当前操作所在的队列
[NSOperationQueue currentQueue];
- 队列的暂停 取消 恢复
- 取消队列的所有操作 取消当前的任务会执行完毕 取消后任务从队列中移除
- (void)cancelAllOperations; // 也可以调用- (void)cancel方法取消单个操作
- 暂停和恢复队列
// YES代表队列暂停 NO代表恢复队列 暂停是暂停后续的任务 当前正在执行的任务不会暂停 - (void)setSupended:(BOOL)b; - (BOOL)isSuspended;
NOperation和NSOperationQueue实现多线程的具体步骤
- 先将要执行的操作封装到一个NSOperation对象中
- 然后将NSOperation对象添加到NSOperationQueue(队列)中
- 系统会自动将NSOperationQueue中的NSOperation取出来
- 将取出的NSOperation封装的操作放到一个新的线程中执行
线程的依赖关系
- 通过设置线程之间的依赖关系可以控制线程的执行顺序
- 操作依赖的方法
- (void)addDependency;
- 注意事项 --- 循环依赖