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