說明
Grand Gentral Dispatch(GCD) 異步執(zhí)行任務(wù)的技術(shù)之一。將應(yīng)用程序中記述的線程管理用的代碼在系統(tǒng)級(jí)中實(shí)現(xiàn)。我們只需要定義需要執(zhí)行的任務(wù)并追加到適當(dāng)?shù)腄ispatch Queue中。
Dispatch Queue
在執(zhí)行處理包含兩種Dispatch Queue,一種是等待現(xiàn)在執(zhí)行中的處理Serial Dispatch Queue ,另一種是不等待現(xiàn)在執(zhí)行中處理的Concurrent Dispatch Queue 。
創(chuàng)建Dispatch Queue
一.dispatch_queue_create
dispatch_queue_create方法第一個(gè)參數(shù)為創(chuàng)建的dispatch_queue_t的類型。第二個(gè)參數(shù)為dispatch_queue_t的名字,可以為NULL。建議命名,調(diào)試時(shí)會(huì)方便很多。
-.創(chuàng)建一個(gè)Serial Dispatch Queue,代碼:
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue",NULL);
雖然Serial Dispatch Queue是需要等待執(zhí)行中處理的,但是dispatch_queue_create是可以創(chuàng)建的,創(chuàng)建的多個(gè)Serial Dispatch Queue的話會(huì)變成并行。每一個(gè)Serial Dispatch Queue都占一條線程。
-.創(chuàng)建一個(gè)Concurrent Dispatch Queue,代碼:
dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue",DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_cteate函數(shù)的返回值均是dispatch_queue_t類型。
為myConcurrentDispatchQueue指定執(zhí)行的block函數(shù)。代碼:
dispatch_async(myConcurrentDispatchQueue,^{NSLog(@"myConcurrentDispatchQueue的block");});
-.dispatch_release
部署版本低于iOS6.0時(shí)需要手動(dòng)調(diào)用。雖然iOS5.0就推出了ARC模式,但是因?yàn)镺S_OBJECT_USE_OBJC是在iOS6才推出的,所以最低部署版本需要iOS6才可以自動(dòng)釋放。
二.Main Dispatch Queue/Global Dispatch Queue
使用系統(tǒng)提供的Dispatch Queue。
-.Main Dispatch Queue
主線程中執(zhí)行的Dispatch Queue。因?yàn)橹骶€程只有一個(gè),所以Main Dispatch Queue自然就是Serial Dispatch Queue。
追加到Main Dispatch Queue 的處理在主線程的RunLoop中執(zhí)行,因此要將用戶界面更新等一些必須在主線程中執(zhí)行的處理追加到Main Dispatch Queue使用,如:網(wǎng)絡(luò)請(qǐng)求中需要刷新界面顯示進(jìn)度,代碼
dispatch_main_async_safe((^{
label.text=[NSString stringWithFormat:@"上傳中%.0f%%",percent*100];
}));
-.Global Dispatch Queue
Global Dispatch Queue 是所有應(yīng)用程序都能使用的Concurrent Dispatch Queue 。沒有必要通過dispatch_queue_create函數(shù)逐個(gè)生存Concurrent Dispatch Queue,只要獲取Global Dispatch Queue使用即可。
優(yōu)先級(jí)介紹
Global Dispatch Queue(High Priority) ? ? ? ? ? ? ? 高
Global Dispatch Queue(Default Priority) ? ? ? ? ? 默認(rèn)
Global Dispatch Queue(Low Priority) ? ? ? ? ? ? ? ?低
Global Dispatch Queue(Background priority) ?后臺(tái)
后臺(tái)優(yōu)先級(jí)因?yàn)镚lobal Dispatch Queue不能保證線程執(zhí)行的實(shí)時(shí)性,因此優(yōu)先級(jí)只是大致判斷。在處理內(nèi)容可有可無時(shí),使用后臺(tái)優(yōu)先級(jí),只能進(jìn)行這種程度的區(qū)分。
獲取方法如下
//Main Dispatch Queue 的獲取方法
dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();
//Global Dispatch Queue (高) 獲取方法
dispatch_queue_t globalDispatchQueueHigh = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);
//Global Dispatch Queue (默認(rèn)) 獲取方法
dispatch_queue_t globalDispatchQueueDefault = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
//Global Dispatch Queue (低) 獲取方法
dispatch_queue_t globalDispatchQueueLow = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0);
//Global Dispatch Queue (后臺(tái)) 獲取方法
dispatch_queue_t globalDispatchQueueBackgroud = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
對(duì)于Main Dispatch Queue和Global Dispatch Queue 執(zhí)行dispatch_retch函數(shù)和dispatch_release函數(shù)不會(huì)引起任何變化,也不會(huì)有任何問題。
dispatch_set_target_queue
可以使多串并行的Queue變成串行執(zhí)行
未完待續(xù)...