iOS多線程之NSOperations

相關文章:
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

參考:
How To Use NSOperations and NSOperationQueues

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 學習多線程,轉載兩篇大神的帖子,留著以后回顧!第一篇:關于iOS多線程,你看我就夠了 第二篇:GCD使用經(jīng)驗與技巧...
    John_LS閱讀 723評論 0 3
  • 多線程 什么是多線程?多線程就是一個進程中可以開啟多條線程,每條線程可以并行執(zhí)行不同的任務,提高執(zhí)行效率;一個基本...
    西風頌閱讀 960評論 1 16
  • 多線程 在iOS開發(fā)中為提高程序的運行效率會將比較耗時的操作放在子線程中執(zhí)行,iOS系統(tǒng)進程默認啟動一個主線程,用...
    郭豪豪閱讀 2,719評論 0 4
  • 在這篇文章中,我將為你整理一下 iOS 開發(fā)中幾種多線程方案,以及其使用方法和注意事項。當然也會給出幾種多線程的案...
    張戰(zhàn)威ican閱讀 684評論 0 0
  • 武漢天河機場正在建設T4航站樓,框架結構已經(jīng)完成,屋頂復雜的鋼構一覽無余,在這個時候看起來特別壯觀,建筑工人們站在...
    陳小煩_閱讀 1,756評論 0 0

友情鏈接更多精彩內(nèi)容