iOS大中分術歌-神奇的多執行緒GCD技術

weixin_33912246發表於2015-08-22

iOS大中分術歌

1. 歌曰:

非同步開發最頭疼
大中分術救碼農
碼塊分發歸佇列
佇列序列和並行
自家生成需釋放
何如系統本現成
主隊不似高低默
後臺佇列並行種
可以後設優先順序
或者晚發幾點鐘
多塊完事可用組
讀寫並串賴障屏
非同步之外有同步
你來決定停不停
多隊竟爭等訊號
分發一次單例成

偉大的分割線:

2. 解釋一下

非同步開發最頭疼
大中分術救碼農
碼塊分發歸佇列
佇列序列和並行

  • 多執行緒非同步程式碼編寫最為複雜, 是眾多程式設計師頭疼的工作, 開發的複雜性, 是多執行緒非同步程式碼編寫的痛點. 蘋果創造性的發明了GDC技術, 用來支援多執行緒程式碼的編寫, 解決開發的複雜性這個痛點, 可謂中送炭, 拯救碼農於水火.
  • GDC是Grand Central Dispatch的簡寫, 中文翻譯叫什麼都有, 我稱之為”大中分”技術.
  • GCD的核心思想是利用block技術和佇列(queue)技術, 實現多執行緒. 將一個個程式碼塊, 塞到不同的佇列裡, 有序或者無需的執行.
  • 佇列有兩種, 一種是序列佇列(SERIAL), 一種是並行佇列(CONCURRENT). 序列佇列就像一縱隊往前走, 程式碼塊挨個執行, 前面的不動, 後面的不能動. 並行佇列就像一個橫排往前走, 誰也不會擋著誰.

    每個小箭頭代表一個block
    序列佇列: →→→→→→→→→→
    並行佇列: ↑↑↑↑↑↑↑↑↑↑

自家生成需釋放
何如系統本現成
主隊不似高低默
後臺佇列並行種

  • 即使在使用了自動引用計數(ARC)的專案裡(目前大多數都預設使用ARC),對於使用者自己生成的佇列(呼叫dispatch_queue_create生成的佇列), 也需要進行手動的引用和釋放: dispatch_retain, dispatch_release
  • 系統已經準備好了一些佇列, 這些佇列不用手動管理引用計數. 包括:dispatch_get_main_queue獲得的主執行緒佇列, dispatch_get_global_queue獲得的全域性佇列分為:高, 低, 預設優先順序的佇列以及後臺佇列.
  • 主執行緒佇列是序列的, 但是全域性佇列是並行的.

可以後設優先順序
或者晚發幾點鐘
多塊完事可用組
讀寫並串賴障屏

  • GDC提供了一系列的方法, 可以設定佇列的優先順序等各種.
  • dispatch_after可以用來設定多久之後將block塞進佇列. 類似於定時器.
  • 利用dispatch_group_notify等函式, 可以設定在一組block執行完成之後再執行某些block.
  • 分組:

[ →


→ ] →

  • dispatch_barrier系列的函式, 可以用來幫助實現並行讀的同時序列寫. barrier是”屏障, 柵欄”等的意思.
  • 屏障:

→ | →(屏障)| →
→ |什麼不是|

非同步之外有同步
你來決定停不停
多隊竟爭等訊號
分發一次單例成

  • GDC也可以用來執行同步的操作
  • 可以暫停或者繼續執行執行緒
  • 也提供了傳統的訊號量機制讓非同步操作進行互斥操作
  • dispatch_once 函式是iOS裡實現單例模式(全域性物件)的不二法寶.

3. 魚與漁

這個什麼歌訣沒什麼重要的, 重要的是提煉知識點, 轉換為適合自己理解記憶的東西這件事. 將一些知識, 梳理總結, 編成歌訣, 寫成部落格, 畫成腦圖,這些方法都是漁, 至於總結出來的部落格, 歌訣, 腦圖, 通常都是魚.

另外, 所有GCD的函式, 都是dispatch_xxx, 所以只要有了Xcode這種能自動提示程式碼的ide, 只要知道GCD能幹什麼, 剩下的, 你懂的.

相關文章