Operation Queue

1、Operation Objecthtml

Operation對象是NSOperation類實例對象,能夠在operation中包含應用程序須要執行的任務,使用時須要用到NSOperation的子類。儘管NSOperation是抽象類,但它給子類提供了大量重要的基礎設置,除外,Foundation框架提供了已經定義好的2個子類NSInvocationOperation、NSBlockOperation。併發

一、自定義NSOperation子類app

能夠改變默認的operation執行方式,打印它的狀態等等。框架

1)支持operation之間存在依賴,這樣operation便同步執行。異步

2)能夠提供completion block,以便在operation的主任務完成後執行。ide

3)使用KVO監控並通知operation執行狀態的改變。函數

4)提供operation優先級設置。ui

5)提供cancel operation操做。spa

二、NSInvocationOperation類線程

三、NSBlockOperation

 

2、併發/非併發Operations

儘管能夠將operations添加到operation queue中,但還能夠經過調用start方法來執行operation,只是start方法不保證operation能併發執行。

isConcurrent方法根據operation開始執行所在的線程是不是star方法所在的線程,返回operation是同步仍是異步執行,默認返回的是NO,意味着在調用線程中同步被執行。

若是想實現異步,必須寫額外代碼異步開啓operation。好比,需建立獨立的線程,調用異步的系統功能,或者另外去確保快速開啓執行任務,並在任務完成前快速返回。大多數開發者不須要實現concurrent operations對象,只需將operations添加到operation queue。

 

3、建立NSInvocationOperation

NSInvocationOperation是NSOperation的子類,經過調用指定對象的指定方法。能避免爲每一個任務定義一個operation對象,尤爲是修改現有應用和已經存在的對象和方法去完成必要的任務。你也能夠用它根據情況改變你想調用的方法。例如,你能夠用invocation operation實現根據用戶輸入動態選擇實現的方法。

@implementation MyCustomClass
- (NSOperation*)taskWithData:(id)MyData {
NSInvocationOperation
* theOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myTaskMethod:) object:MyData]; return theOp; } // This is the method that does the actual work of the task. - (void)myTaskMethod:(id)MyData { // Perform the task. } @end

 

4、建立NSBlockOperation

NSBlockOperation是NSOperation的子類,它就像是包裹了一個或多個block。使用operation queue爲應用提供面對對象的包裹,你能夠用block operation去利用operation依賴,KVO通知,及其它dispatch queue沒有的特徵。

在建立block operation時至少添加一個block,而後能夠根據需求增添多個blocks。當執行NSBlockOperation的時機到來,block operation提交全部的blocks至默認優先級的併發調度隊列中,等待至全部的blocks結束運行。在最後一個block執行結束時,operation自己狀態爲finished。所以,能夠用block operation去跟蹤一組執行blocks,就像使用thread join去合併多個線程結果。不一樣的是由於block operation自己在獨立的線程中運行,在等待block operation徹底執行完畢前,應用的其它線程能夠繼續執行。

NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{
      NSLog(@"Beginning operation.\n");
      // Do some work.

}];

// addExecutionBlock:函數能夠繼續添加block。

If you need to execute blocks serially, you must submit them directly to the desired dispatch queue.

 

5、本文參考自蘋果官方文檔

https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW1

相關文章
相關標籤/搜索