1. 程式人生 > >iOS 多執行緒(三)NSOperation

iOS 多執行緒(三)NSOperation

NSOperation

NSOperation是蘋果封裝的一套多執行緒的東西,不像GCD是純C語言的,這個是OC的。但相比較之下GCD會更快一些,但本質上NSOPeration是多GDC的封裝。

NSOperation相對於GCD:
  1. NSOperation擁有更多的函式可用
  2. NSOperationQueue中,可以建立各個NSOperation之間的依賴關係。
  3. NSOperationQueue支援KVO。可以監測operation是否正在執行(isExecuted)、是否結束(isFinished),是否取消(isCanceld)
  4. GCD 只支援FIFO 的佇列,而NSOperationQueue可以調整佇列的執行順序

NSOperation剖析

NSOperation是個抽象類,並不具備封裝操作的能力,必須使用它的子類

使用NSOperation子類的方式有3種

  1. NSInvocationOperation
  2. NSBlockOperation
  3. 自定義子類繼承NSOperation,實現內部相應的方法

NSOperationQueue

1.NSOperation可以呼叫start方法來執行任務,但預設是同步執行的
2.如果將NSOperation新增到NSOperationQueue(操作佇列)中,系統會自動非同步執行NSOperation中的操作

// 新增操作到NSOperationQueue中
- (void)addOperation:(NSOperation *)op;
- (void)addOperationWithBlock:(void (^)(void))block;

NSOperation的使用

配合使用NSOperation和NSOperationQueue就能實現多執行緒程式設計
具體步驟:
1.將需要執行的操作封裝到一個NSOperation物件中
2.將NSOperation物件新增到NSOperationQueue中
3.系統會自動將NSOperationQueue中的NSOperation取出來放到一條新執行緒中執行

NSInvocationOperation子類

// 1.建立NSInvocationOperation物件
- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;

// 2.呼叫start方法開始執行操作
- (void)start;
// 一旦執行操作,就會呼叫target的sel方法

注意:

  • 預設情況下,呼叫了start方法後並不會開一條新執行緒去執行操作,而是在當前執行緒同步執行操作。
  • 只有將NSOperation放到一個NSOperationQueue中,才會非同步執行操作

NSBlockOperation子類

// 1.建立NSBlockOperation物件
+ (id)blockOperationWithBlock:(void (^)(void))block;

// 2.通過addExecutionBlock:方法新增更多的操作
- (void)addExecutionBlock:(void (^)(void))block;

注意:

  • 只要NSBlockOperation封裝的運算元 > 1,就會非同步執行操作

自定義NSOperation

// 1.建立物件繼承NSOperation,重寫
- (void)main;
// 在裡面實現想執行的任務

注意:

  • 自己建立自動釋放池(因為如果是非同步操作,無法訪問主執行緒的自動釋放池)
  • 經常通過
- (BOOL)isCancelled

方法檢測操作是否被取消,對取消做出響應。

NSOperation方法

一、最大併發數

可以通過對最大併發數設定,控制程式中執行緒的數量

// 1.最大併發數的相關方法
- (NSInteger)maxConcurrentOperationCount;
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;

二、取消、暫停、恢復

// 1.取消佇列的所有操作
- (void)cancelAllOperations;
// 2.取消單個操作
- (void)cancel

// 暫停
- (void)setSuspended:(BOOL)b; // YES代表暫停佇列,NO代表恢復佇列
// 恢復佇列
- (BOOL)isSuspended;

三、依賴

NSOperation之間可以設定依賴來保證執行順序

// 1.比如一定要讓操作A執行完後,才能執行操作B,可以這麼寫
[operationB addDependency:operationA]; // 操作B依賴於操作A

注意:可以在不同queue的NSOperation之間建立依賴關係

四、操作的監聽

// 1.可以監聽一個操作的執行完畢
- (void (^)(void))completionBlock;
- (void)setCompletionBlock:(void (^)(void))block;

致謝

感謝您花時間閱讀,期待與您的交流。