八.併發編程


    1-GCD-Grand Central Dispatch,GCD使用隊列來管理多個任務,而每個任務是以塊(其定義類似於函數)來描述的。GCD從隊列中讀取這些要完成的任務,然後其多核執行引擎負責將這些任務分配給它所管理的線程。和手動線程管理相比,GCD能極大地優化線程管理,並極大地減少創建和銷燬線程所帶來的額外開銷。除了在多核系統上得性能改進之外,GCD還能幫助提高應用的響應速度,並讓代碼更爲乾淨,易於維護。


    2-NSOperationQueue-操作隊列,可以極大地減少開發者在併發編程中的負擔,並且操作隊列有一套Objective-C的API,使用起來方便。
    基本操作單位-NSOperation,操作。
    操作是封裝了一個與任務有關的代碼與數據的抽象類,需要繼承NSOperation,並且描述相關的任務。操作對象是一次性的,它只能執行一次,下一次,需要創建一個新的實例。
    可以通過addDependency:方法爲操作添加相互依賴性。假設操作A依賴於操作B,如果操作B沒有結束,操作A就不會開始執行。完成是指 執行完,或者取消了操作。有時需要對操作是否成功作出判斷。通過removeDependency:方法來移除操作的相互依賴性。
    操作的一個屬性是isConcurrent。當使用操作隊列來管理這些操作時,isConcurrent應當設置爲NO,這時應當重載 NSOperation的main函數(在類中保存controller對象-weak,並在main中調用controller的方法)。 isReady屬性用於描述操作是否已經可以開始執行,isExecuting屬性表示操作是否正在執行當中,isFinished屬性表示操作是否順利完成,isCancelled屬性則表示操作已經取消。
    可以在操作運行中取消它的運行,只需要給它發送cancel消息即可。在繼承NSOperation類時,也需要支持cancel方法。
    如果只需要簡單的操作,不想繼承NSOperation類,可以使用NSInvocationOperation類,這個類中的-initWithTarget:selector:object:方法能幫助你方便地選擇人物的對象和相應的功能。
    操作的執行順序取決於各自的優先級和相互之間的依賴性。
    操作隊列有兩種方式來執行其中的操作。第一種是開闢新線程來運行這些操作,第二種則是通過GCD來運行這些操作。但是無論如何,都不需要手動管理 線程。儘量使用操作隊列,只有在操作隊列的效率明顯不足時才轉向GCD。因爲操作隊列是封裝在GCD的基礎之上的,雖然增加了一些額外開銷,但是也具有更加完善的功能。例子是TestNSOperation。
發佈了91 篇原創文章 · 獲贊 5 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章