1.什么是GCD抱既?
GCD (Grand Central Dispatch) 是異步執(zhí)行任務(wù)的技術(shù)之一相赁,以非常簡潔的語法實(shí)現(xiàn)了復(fù)雜繁瑣的多線程編程。
使用GCD的語法如下:
dispatch_async(queue, ^{
? //在后臺(tái) 執(zhí)行耗時(shí)的操作處理,處理完畢后調(diào)用主線程更新用戶界面
? dispatch_async(dispatch_get_main_queue(), ^{
? ? ? //主線程同步发侵,例如更新用戶界面
? ?});
});
2.Dispatch_Queue
GCD中有2種類型隊(duì)列氧腰,Serial Dispatch Queue 和 ConcurrentDispatch Queue枫浙。
1) Serial Dispatch Queue
串行隊(duì)列,按照任務(wù)順序執(zhí)行處理容贝,在同一時(shí)間執(zhí)行一個(gè)任務(wù)自脯,如下圖:
Serial Dispatch Queue 不使用鎖,可以解決多線程中 “數(shù)據(jù)競爭”的問題斤富,如下圖:
iOS 中的UI主線程隊(duì)列 是Serial Dispatch Queue 類型膏潮,創(chuàng)建一個(gè)Serial Dispatch Queue時(shí),系統(tǒng)會(huì)為此隊(duì)列創(chuàng)建一個(gè)線程满力,比如創(chuàng)建5個(gè)Serial Dispatch Queue此時(shí)系統(tǒng)就會(huì)創(chuàng)建5個(gè)線程焕参,過多的創(chuàng)建會(huì)消耗大量內(nèi)存轻纪,引起大量上下文切換,大幅降低系統(tǒng)相應(yīng)性能叠纷。
2) Concurrent Dispatch Queue
并行隊(duì)列刻帚,隊(duì)列中執(zhí)行的任務(wù)順序是不固定的,如下圖:
Concurrent Disaptch Queue 使用XNU內(nèi)核來管理線程涩嚣,不會(huì)發(fā)生Serial Dispatch Queue的問題崇众。如果操作中不存在"數(shù)據(jù)競爭" 問題,請(qǐng)使用Concurrent Dispatch Queue航厚。
3.創(chuàng)建隊(duì)列
1) 使用dispatch_queue_create
創(chuàng)建Serial Dispatch Queue
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("queue identity", nil);
創(chuàng)建Concurrent Dispatch Queue
dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("queue identity", DISPATCH_QUEUE_CONCURRENT);
參數(shù)1 :隊(duì)列的標(biāo)示(建議identity定義的規(guī)范顷歌,在輸出錯(cuò)誤日志調(diào)試時(shí)非常有用)
參數(shù)2: 隊(duì)列類型,nil 代表 Serial 隊(duì)列 , DISPATCH_QUEUE_CONCURRENT代表 Concurrent 隊(duì)列
*具體信息可查閱蘋果官方的幫助文檔
2) 使用系統(tǒng)標(biāo)準(zhǔn)提供的 Dispatch Queue 來創(chuàng)建
dispatch_get_global_queue()
dispatch_get_main_queue()