: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:^{ }];
=========================================================
其餘線程方式: