iOS NSOperation vs GCD(NSOperation實現(xiàn)GCD調(diào)度組功能/ GCD實現(xiàn)NSOperation依賴關(guān)系)

iOS關(guān)乎多線程的方面的知識,目前使用最頻繁而且最火熱的當(dāng)屬NSOperation和GCD。
NSOperation和GCD都是并發(fā)技術(shù)方案,能夠更有效地利用多核CPU來處理問題。

As you know,NSOperation 的底層實現(xiàn)是GCD。那么我在開發(fā)中使用誰都是一樣的,那就是誰順手、誰方便用誰嘍,這樣根據(jù)實際情況來使用。

NSOperation是 抽象類(abstract 關(guān)鍵字修飾)。一般來說iOS程序員對于抽象類的概念不是很清晰,也不經(jīng)常提到,但是在java或者C#就不一樣了,有很多抽象類、抽象方法,還有虛方法(virtual關(guān)鍵字修飾)等,非常靈活。

那么對于抽象類和抽象方法,如下:
----抽象類:本身不能被實例化,只能通過派生類(子類)來實例化;
----抽象方法:方法定義的時候沒有方法體,本身(定義時)不能被實現(xiàn),只能通過派生類重新實現(xiàn)。 (抽象方法只能定義在抽象類中)

對于NSOperation,系統(tǒng)提供了 2 個子類,NSInvokeOperation 和 NSBlockOperation。加上自定義Operation共 3 種方式。
對于GCD,系統(tǒng)提供了很多功能,在此不一一列舉。

-------------------- 分割線 -------------------

這里來說說NSOperation和GCD的不同點。

NSOperation 可以設(shè)置 最大并發(fā)數(shù)、任務(wù)與任務(wù)的依賴關(guān)系、取消操作的執(zhí)行 等功能,這些是 GCD 的API中所不具備的;
GCD 可以實現(xiàn) 調(diào)度組 等功能,這是NSOperation所不具備的。

一、 NSOperation實現(xiàn)GCD調(diào)度組的功能

【調(diào)度組,就是多個任務(wù)完成之后系統(tǒng)會給一個通知,通知用戶多個任務(wù)已完成;我們可以在通知中做其它任務(wù)。】

【方案一:添加操作集合并設(shè)置等待執(zhí)行完畢】
使用 [operationQueue addOperations:@[op1, op2, op3] waitUntilFinished:YES];
的方式向隊列添加操作集合,然后把添加操作的函數(shù)放到子線程中,那么會等這幾個操作都執(zhí)行完畢之后再進行之后的代碼。

【方案二:使用KVO監(jiān)聽queue的operationsCount】
等到operationsCount 為 0 的時候,發(fā)出通知,任務(wù)已經(jīng)完成。

【方案三:使用NSBlockOperation】
addOperation、addExecutionBlock、completionBlock

二、GCD實現(xiàn)NSOperation的“設(shè)置依賴關(guān)系”功能

【依賴關(guān)系,就是一個操作要等待另一個操作完成才能開始(一個操作依賴另一個操作)】

  • 【子線程中使用多個同步任務(wù),任務(wù)是按順序執(zhí)行】

  • 【使用同步隊列,任務(wù)是按順序執(zhí)行】

  • 【多個調(diào)度組,每個調(diào)度組調(diào)度一個任務(wù)】

  • 【使用多個 dispatch_barrier 障礙阻塞 】

  • 【使用異步配合runloop使用】

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

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

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