:fa-exclamation-triangle:如下是你须要考虑使用 NSOperation 的一些理由:并发
1.当你须要取消线程任务时,GCD 没法提供取消任务的操做。而 NSOperation 提供了取消任务的操做;异步
2.当你须要更细的粒度地观察任务改变了状态时,因为 NSOperation 是一个对象,比较 GCD 使用的 block 而言,经过对 NSOperation 对象进行键值观察(KVO)能很容易观察到任务的状态改变;spa
3.当你须要重用线程任务时,NSOperation 做为一个普通的 Objective-C 对象,能够存储任何信息。对象就是为重用而设计的,这时,NSOperation 比 GCD 使用的 block 要更方便。.net
实际开发中使用的是NSOperation的两个子类线程
- NSInvocationOperation - NSBlockOperation :使用block形式组织代码,相对方便
异步:建立NSOperation -> 建立NSOperationQueue队列 -> 将NSOperation添加到Queue中 同步:建立NSOperation -> 调用start方法
isReady :准备就绪 -> 只读(有线程依赖时可能为NO) isExecuting :正在执行 -> 只读 isFinished :执行完了 -> 只读 isCancelld :已经取消 -> 能够手动干预:调用cancel()方法 - 只是设置队列状态,并非真正的中止当前队列
线程优先级分为5个级别设计
@property double threadPriority; //IOS8已废弃 @property NSOperationQueuePriority queuePriority; typedef NS_ENUM(NSInteger, NSOperationQueuePriority) { NSOperationQueuePriorityVeryLow = -8L, NSOperationQueuePriorityLow = -4L, NSOperationQueuePriorityNormal = 0, NSOperationQueuePriorityHigh = 4, NSOperationQueuePriorityVeryHigh = 8 };
A依赖于B:B执行完以后,才能执行A 添加依赖code
- (void)addDependency:(NSOperation *)op;
删除依赖orm
- (void)removeDependency:(NSOperation *)op;
operation.completionBlock = ^(){ //执行完毕 }; - (void)waitUntilFinished;
负责管理/执行全部的NSOperation对象
可以更加容易的管理线程总数,控制线程之间的依赖关系blog
- (void)addOperation:(NSOperation *)op; - (void)addOperations:(NSArray<NSOperation *> *)ops waitUntilFinished:(BOOL)wait; - (void)addOperationWithBlock:(void (^)(void))block;
queue.maxConcurrentOperationCount = ?
- (void)cancelAllOperations;
- (void)waitUntilAllOperationsAreFinished;
[[NSOperationQueue mainQueue] addOperation...];
建立线程:
- (instancetype)initWithTarget:(id)target selector:(SEL)sel object:(id)arg; - (instancetype)initWithInvocation:(NSInvocation *)inv;
例子:
//建立操做 NSInvocationOperation *invocationOpr = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(load) object:nil]; //建立队列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //添加到队列,队列回开启一个线程执行此操做 [queue addOperation : invocationOpr];
建立线程
+ (instancetype)blockOperationWithBlock:(void (^)(void))block; //在已有的线程的基础上,添加其余线程:并发 - (void)addExecutionBlock:(void (^)(void))block;
例子:
方法一:建立操做并添加到队列 NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{ }]; //建立队列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //添加到队列 [queue addOperation : block]; 方法二:直接添加操做到队列 //建立队列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperationWithBlock:^{ }];
=========================================================
其余线程方式: