1 前言
並發在程序設計中比比皆是,如何能在IOS開發中更好的運用並發已經成為一個關鍵問題,今天我們就簡單的來介紹一下並發。
2 正文
當兩個或兩個以上的任務同時執行時就發生了並發。即使只有一個 CPU,現代操作系統也能夠在同時執行多個任務。
Grand Central Dispatch,或者簡稱 GCD(中央調度),是一個與 Block Object 產生工作的低級的 C API。GCD 真正的用途是將任務分配到多個核心又不讓程序員擔心哪個內核執行哪個任務。
GCD 的核心是分派隊列。不論在 iOS 還是 Max OS X 分派隊列,正如我們快看到的是由位於主操作系統的 GCD 來管理的線程池。你不會直接與線程有工作關系。你只在分派隊列上工作,將任務分派到這個隊列上並要求隊列來調用你的任務。GCD 為運行任務提供了幾個選擇:同步執行、異步執行和延遲執行等。
要在你的 APP 開始使用 GCD,你沒有必要將任何特殊庫導入你的項目。Apple 已經在 GCD 中納入了各種框架,包括 Core Foundation 和 Cocoa/Cocoa Touch。GCD 中的所有方法和數據類型都以 dispatch_關鍵詞開頭。例如,dispatch_async 允許你在一個隊列上分派任務來異步執行,而 dispatch_after 允許你在一個給定的延遲之後運行一個 block。傳統上,程序員必須創建自己的線程來並行執行任務。
我們會一直和分派隊列打交道,所以請確保你完全理解了其背後的概
念。有 3 種分派隊列:
Main Queue
這個隊列在主線程上執行它的所有任務,Cocoa 和 Cocoa Touch 允許程序員在主線程上調用一切 UI-related 方法。使用 dispatch_get_main_queue 函數檢索到主隊列的句柄。
Concurrent Queues
為了執行異步和同步任務,你可以在 GCD 中檢索到這寫隊列。多個並發隊列能夠輕而易舉的並行執行多
這些允許你在另一個當前存在的對象中調用一個方法。
個任務,沒有更多的線程管理,酷!使用 dispatch_get_global_queue 函數檢索一個並發隊列的句柄。
Serial Queues
無論你提交同步或者異步任務,這些隊列總是按照先入先出(FIFO)的原則來執行任務,這就意味著它們一次執行一個 Block Object。然而,他們不在主線程上運行,所以對於那些要按照嚴格順序執行並不阻塞主線程的任務而言是一個完美的選擇。使用 dispatch_queue_create 函數創建一個串行隊列。一旦你使用完整隊列,必須使用 dispatch_release 函數釋放它。
Block Object 是通常在 Objective-C 中以方法形式出現的代碼包。Block Objects 和 GCD 共同創建了一個和諧環境,在這個環境裡你能在 iOS 和 Mac OS X 上發布高性能的多線程 APPs。Block Objects 和 GCD 有什麼特別的地方呢?你可能會問。很簡單:沒有太多的線程!所有你要做的事情就是把代碼放進 Block Objects 然後要求 GCD 來為你小心執行代碼。
GCD 與 Block Objects 一起工作。當使用 GCD 執行任務時,你可以傳遞一個 Block Object,它可以同步或者異步執行,取決於你在 GCD 中使用的方法。然而,你可以創建一個 Block Object 負責下載一個作為參數傳遞到它的 URL。單獨的 Block Object 可以同步或者異步應用於 APP 的任何地方,這個位置依賴於你想如何運行它。你不必使 Block Object 本身同步或異步,你只要簡單通過同步或者異步的 GCD 方法來調用它,它就會工作。
操作可以同步或者異步執行代碼塊。你可以手動管理操作或者是把它們放到操作隊列中,這個隊列會促使
並發以致於你不需要思考底層線程管理。
Cocoa 提供了 3 種不同的操作:
Block Operations
它們促使執行一個或多個 Block Objects.
Invocation Operations
這些允許你在另一個當前存在的對象中調用一個方法。
Plain Operations
這些都是需要被繼承普通操作的類。將要執行的代碼會被寫入操作對象的主要方法中。
當 APP 在 iOS 上運行時,操作系統為 APP 創建了至少一個線程,稱作主線程,每個線程必須添加到一個運行循環中。運行循環,顧名思義,是一個循環過程中的不同事件可以發生,如觸發計時器或運行線程。
將運行循環想象成一種有一個開始點、一個完成條件和一系列在其生命周期內發生的事件的循環。一個線程或者計時器與一個運行附加到運行循環,事實上需要運行循環激活其功能。
一個 APP 的主線程是處理 UI 事件的線程。如果你在主線程執行一個長時間運行的任務,就要注意 APP的 UI 會沒有響應或者響應緩慢。為了避免這一點,你可以創建一個獨立線程和/或計時器,它們會分別執行各自的任務(即使是一個長時間運行的任務)同時又不會阻塞主線程。
3 結語
以上是對並發的簡單介紹,希望能幫大家入門理解有所幫助。