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