NSOperation:抽象类。
- (void)start;: 开启任务操作。NSOperation对象默认按同步方式执行,也就是在调用start方法的那个线程中直接执行。
- (void)main;: 类的主函数,一般在自己定义继承自NSOperation的类中重写该方法以实现执行任务。
在一个opeartionQueue里面有多个Operation任务的时候,有的Operation任务需要依赖于其他任务的完成再执行,这个时候可以给这个Operation添加依赖,依赖于其他Operation任务。
- (void)addDependency:(NSOperation *)op;:添加依赖关系。
- (void)removeDependency:(NSOperation *)op;:移除依赖关系。
在一个opeartionQueue里面有多个Operation任务的时候,有的Operation任务相对于其他Operation 任务需要优先执行,这个时候可以设置Operation任务在queue里面的优先级。但是需要注意:优先级不能替代依赖关系,优先级只是对已经准备好的 operations确定执行顺序。先满足依赖关系,然后再根据优先级从所有准备好的操作中选择优先级最高的那个执行。这个优先级不好用,因为准备好这个事情是不可控的。
@property NSOperationQueuePriority queuePriority;
@property NSQualityOfService qualityOfService NS_AVAILABLE(10_10,8_0);
系统提供了两个NSOperation子类。NSBlockOperation VS NSInvocationOperation
NSBlockOperation
+ (instancetype)blockOperationWithBlock:(void(^)(void))block;
- (void)addExecutionBlock:(void(^)(void))block;
对于blockOpeartion来说,实例化方法中的block任务会在启动operation的线程里执行,如主线程,而add进来block任务会在其他线程里执行。
NSInvocationOperation
没有像BlockOperation那样的add任务的功能,因此它的任务的执行就在start 这个Operation的线程里面。
自定义NSOperation子类
重写NSOperation里面的main方法。调用start方法启动任务执行。仍然是在启动start的线程里执行main方法里面的任务;
NSOperationQueue,queue里面的任务在非UI线程里面并发执行。单独的NSOperation的任务在调用start的线程里面同步执行。
添加Operation的操作:
- (void)addOperation:(NSOperation*)op;
- (void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait NS_AVAILABLE(10_6,4_0); wait为YES时会阻塞启动queue的线程。如果在主线程中启动,就阻塞主线程。
- (void)addOperationWithBlock:(void(^)(void))block NS_AVAILABLE(10_6,4_0);
获取OperationQueue中operations,这里是queue里面没有执行的operations,执行完成的operations会从queue里面去除,并且count也会减少。
@property(readonly,copy)NSArray<__kindofNSOperation*> *operations;
@property(readonly)NSUInteger operationCount NS_AVAILABLE(10_6,4_0);
设置queue里面并发数量的限制。
@property NSInteger maxConcurrentOperationCount;
queue的优先级,跟operation的优先级一样,不好用。设置后起不到优先级的作用。
@property NSQualityOfService qualityOfService NS_AVAILABLE(10_10,8_0);
queue里面取消全部任务
- (void)cancelAllOperations;
阻塞线程等待所有任务结束
- (void)waitUntilAllOperationsAreFinished;
网友评论