相關文章:
iOS多線程之NSThread
iOS多線程之GCD
NSOperation(任務)與NSOperationQueue(隊列)是在GCD之上構建的,但是相較于GCD它具有如下特點:
- 采用面向?qū)ο蟮姆绞?/li>
- 任務、隊列可以被cancel/suspend
-
NSOperation(任務)之間可以添加依賴(dependency)
NSOperationQueue(隊列)
| Api | 備注 |
|---|---|
- (void)addOperation:(NSOperation *)op;- (void) addOperationWithBlock:(void (^)(void))block; |
添加任務到queue |
@property NSInteger maxConcurrentOperationCount; |
設置queue的并發(fā)數(shù),如果為1則相當于是串行隊列
|
@property (getter=isSuspended) BOOL suspended
|
掛起或者取消掛起 |
| @property (nullable, copy) NSString *name | 設置隊列的名稱 |
- (void)cancelAllOperations
|
取消所有任務, 注意:這個方法只會將隊列中所有任務( NSOperation)的狀態(tài)屬性字段cancelled設置為YES,并不會真正的kill掉這個任務的線程,通常需要在自定義的NSOperation內(nèi)部重寫main方法(任務代碼),并在main方法中時不時的判斷任務是否isCancelled,如果是則主動中止任務并返回 |
+ (nullable NSOperationQueue *)currentQueue
|
獲取當前隊列,注意是類方法 |
+ (NSOperationQueue *)mainQueue
|
獲取main隊列 |
NSOperation (任務)
| Api | 備注 |
|---|---|
- (void)start; - (void) main; |
一般我們不需要重載start方法。1)當我們將任務添加到隊列的時候,會自動調(diào)用這個任務的 start方法 進行一些準備工作,之后執(zhí)行main方法(核心任務代碼), |
@property (readonly, getter=isCancelled) BOOL cancelled; - (void) cancel; |
設置任務狀態(tài)為取消、判斷任務是否被取消, 注意: cancel并不會主動取消任務,需要在main中根據(jù)isCancelled獲取狀態(tài)并進行相應的處理。 |
@property (readonly, getter=isExecuting) BOOL executing
|
任務是否正在執(zhí)行 |
@property (readonly, getter=isFinished) BOOL finished
|
以下情況時為YES:1)任務完成 2)任務被取消 3)任務被暫停 |
- (void)addDependency:(NSOperation *)op; |
添加任務依賴,當前任務依賴于任務op,只有任務op執(zhí)行完成后當前任務才會開始執(zhí)行 |
- (void)removeDependency:(NSOperation *)op; |
刪除任務依賴 |
@property NSOperationQueuePriority queuePriority; |
任務優(yōu)先級 |
| @property (nullable, copy) void (^completionBlock)(void); | 設置任務完成后執(zhí)行block |
@property (nullable, copy) NSString *name
|
任務名稱 |
NSOperation的2個子類
@interface `NSBlockOperation` : NSOperation
// 根據(jù)block返回NSBlockOperation實例
+ (instancetype)blockOperationWithBlock:(void (^)(void))block;
// 添加新的任務,這些任務會并行執(zhí)行
- (void)addExecutionBlock:(void (^)(void))block;
@property (readonly, copy) NSArray<void (^)(void)> *executionBlocks;
@end
@interface `NSInvocationOperation` : NSOperation
// 用selector的方式創(chuàng)建任務
- (nullable instancetype)initWithTarget:(id)target selector:(SEL)sel object:(nullable id)arg;
@end