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使用】