iOS Concurrency Programming Guide
iOS 和 Mac OS 傳統的並發編程模型是線程,不過線程模型伸縮性不強,而且編寫正確的線程代碼也不容易。Mac OS 和 iOS 采取 asynchronous design approach 來解決並發的問題。
引入的異步技術有兩個:
Grand Central Dispatch:系統管理線程,你不需要編寫線程代碼。只需定義想要執行的任務,然後添加到適當的dispatch queue。Grand Central Dispatch會負責創建線程和調度你的任務。系統直接提供線程管理,比應用實現更加高效。
Operation Queue:Objective-C對象,類似於dispatch queue。你定義想要執行的任務,並添加任務到operation queue,後者負責調度和執行這些任務。和Grand Central Dispatch一樣,Operation Queue也管理了線程,更加高效。
Dispatch Queue
基於C的執行自定義任務機制。dispatch queue按先進先出的順序,串行或並發地執行任務。serial dispaptch queue一次只能執行一個任務,直接當前任務完成才開始出列並啟動下一個任務。而concurrent dispatch queue則盡可能多地啟動任務並發執行。
優點:
直觀而簡單的編程接口
提供自動和整體的線程池管理
提供匯編級調優的速度
更加高效地使用內存
不會trap內核under load
異步分派任務到dispatch queue不會導致queue死鎖
伸縮性強
serial dispatch queue比鎖和其它同步原語更加高效
Dispatch Sources
Dispatch Sources 是基於C的系統事件異步處理機制。一個Dispatch Source封裝了一個特定類型的系統事件,當事件發生時提交一個特定的block對象或函數到dispatch queue。
你可以使用Dispatch Sources監控以下類型的系統事件:
定時器
信號處理器
描述符相關的事件
進程相關的事件
Mach port事件
你觸發的自定義事件
Operation Queues
Operation Queues是Cocoa版本的並發dispatch queue,由 NSOperationQueue 類實現。dispatch queue總是按先進先出的順序執行任務,而 Operation Queues 在確定任務執行順序時,還會考慮其它因素。最主要的一個因素是指定任務是否依賴於另一個任務的完成。你在定義任務時配置依賴性,從而創建復雜的任務執行順序圖。
提交到Operation Queues的任務必須是 NSOperation 對象,operation object封裝了你要執行的工作,以及所需的所有數據。由於 NSOperation 是一個抽象基類,通常你需要實現一個自定義子類來執行任務。不過Foundation framework自帶了一些具體子類,你可以創建並執行相關的任務。
Operation objects會產生key-value observing(KVO)通知,對於監控任務的進程非常有用。雖然operation queue總是並發地執行任務,你可以使用依賴,在需要時確保順序執行。
異步設計技術
通過確保主線程自由響應用戶事件,並發可以很好地提高應用的響應性。通過將工作分配到多核,還能提高應用處理的性能。但是並發也帶來一定的額外開銷,並且使代碼更加復雜,更難編寫和調試代碼。
因此在應用設計階段,就應該考慮並發,設計應用需要執行的任務,及任務所需的數據結構。
Operation Queues
基於Objective-C,因此基於Cocoa的應用通常會使用Operation Queues
Operation Objects
operation object 是 NSOperation 類的實例,封裝了應用需要執行的任務,和執行任務所需的數據。NSOperation 本身是抽象基類,我們必須實現子類。Foundation framework提供了兩個具體子類,你可以直接使用:
類 描述 NSInvocationOperation 可以直接使用的類,基於應用的一個對象和selector來創建operation object。如果你已經有現有的方法來執行需要的任務,就可以使用這個類。 NSBlockOperation 可以直接使用的類,用來並發地執行一個或多個block對象。operation object使用“組”的語義來執行多個block對象,所有相關的block都執行完成之後,operation object才算完成。 NSOperation 基類,用來自定義子類operation object。繼承NSOperation可以完全控制operation object的實現,包括修改操作執行和狀態報告的方式。