GCD詳解及實現

GCD-概要

什麼是GCD

GCD-Grand Central Dispatch 是異步執行的任務之一,將應用程序中線程管理用的帶來在系統級中進行實現,開發者只要將任務追加到適當的Dispatch Queue中,GCD就能生成必要的線程並計劃執行任務,GCD使用非常簡潔的記述方式,實現了頗爲複雜的多線程編程。
(Dispatch Queue)-執行處理的等待隊列,應用程序開發人員,通過dispathc_async函數等api,在block語法中,編寫需要執行的處理,並將其追加到Dispatch Queue中進行處理。
例如,dispatch_async(queue,^{
執行長時間處理的任務,如數據庫查詢、訪問。
長時間處理結束,這時候通常需要調用主線程處理結果。
這時候調用,
dispatch_async(dispatch_get_main_queue(),^{
在主線程可執行的處理,如用戶界面更新。
});
});
多線程中存在的問題:
多個線程操作同一個資源導致數據不一致(數據競爭)
死鎖-多個線程持續相互等待
太多線程消耗大量內存
多線程的優點,可以保證應用程序的響應性能,在ios開發中使用多線程編程在執行長時間處理時仍可保證用戶界面的響應性能。而蘋果提供的GCD大大簡化了偏於複雜多線程編碼的源代碼。

GCD的主要API

dispatch queue的創建。

dispatch_queue執行處理的等待隊列,有兩種方式的dispatch_queue。serial dispatch queue,需要等待現執行中處理結束後才執行下一個任務。
concurrent dispatch queue,不等待現在執行中處理結束。可以並行執行多個處理,並行處理的數量取決於當前系統的狀態(cpu核心數、dispatch queue處理數,cpu負荷等系統狀態);
創建方式有兩種:

方法一、通過GCD提供的API生成Dispatch Queue

dispatch_queue_t mySelfDefineDispatchQueue=dispatch_queue_create(“com.house.zhang”,NULL); 參數一指定了dispatch queue的名稱(建議使用應用程序ID-在調試,崩潰log中會標示),參數二代表dispatch queue類型,當爲serial dipatch queue時該參數設置爲NULL,另外一種則設置爲DISPATCH_QUEUE_CONCURRENT

方法二、獲取系統標準提供的的Dispatch Queue

系統提供了,Main Dispatch Queue和Global Dispatch Queue。
Main Dispatch Queue是在主線程中執行的Dispatch Queue,因爲主線程只有一個,所以其類型爲serial dispatch queue,追加到,Main Dispatch Queue的處理在主線程的RunLoop中執行,由於在主線程中執行,因此要將用戶界面更新等一些必須在主線程執行的處理追加到Main Dispatch Queue中使用。與NSObject類中的performSelectorOnMainThread方法相同。
Global Dispatch queue是所有應用程序都能夠使用的Concurrent Dispatch Queue。沒要必要自己去創建,獲取Global dispatch queue使用就夠了。
獲取方法
dispatch_queue_t mainDispatchQueue = dipatch_get_main_queue();
dispatch_queue_t globalDispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);
Global dispatch queue有四個執行優先級,DISPATCH_QUEUE_PRIORITY_HIGH、DISPATCH_QUEUE_PRIORITY_DEFAULT,DISPATCH_QUEUE_PRIORITY_LOW,DISPATCH_QUEUE_PRIORITY_BACKGROUND.
例子:
/**在默認優先級的Global Dispatch Queue中執行Block**/
dipatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
/執行長時間處理的任務/
dispatch_async(dispatch_get_main_queue(),^{
在主線程可執行的處理,如用戶界面更新。
});
});

發佈了67 篇原創文章 · 獲贊 20 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章