GCD全程Grand Central Dispatch
摒棄掉了線程中復(fù)雜的創(chuàng)建線程和開啟線程的繁瑣。只需要關(guān)注最關(guān)鍵的兩個(gè)步驟:任務(wù)和隊(duì)列
同步方式執(zhí)行任務(wù):
dispatch_sync
異步的方式執(zhí)行任務(wù):
dispatch_async
區(qū)別:同步:只能在當(dāng)前線程中執(zhí)行任務(wù),不具備開啟新線程的能力
????????? 異步:可以在新的線程中執(zhí)行任務(wù),具備開啟新的線程的能力
隊(duì)列:并發(fā)隊(duì)列? :可以讓多個(gè)任務(wù)同時(shí)進(jìn)行(自動(dòng)開啟多個(gè)線程同時(shí)執(zhí)行任務(wù))
????????? 并發(fā)功能只在異步(dispatch_async)函數(shù)下才有效
????????? 串行隊(duì)列 :讓任務(wù)一個(gè)接著一個(gè)進(jìn)行,一個(gè)任務(wù)完成才能執(zhí)行下一個(gè)任務(wù)。
四種隊(duì)列組合:
異步并發(fā): dispatch_async +DISPATCH_QUEUE_CONCURRENT可以同時(shí)開啟多條線程。
同步并發(fā):dispatch_sync +DISPATCH_QUEUE_CONCURRENT 不會(huì)創(chuàng)建新的線程(并發(fā)并未體現(xiàn)出來,實(shí)現(xiàn)效果和同步串行一樣,但是會(huì)更加消耗性能。)
異步串行:dispatch_async+DISPATCH_QUEUE_SERIAL 會(huì)開啟新的線程,但是執(zhí)行完一個(gè)任務(wù)才回執(zhí)行下一個(gè)。
同步串行:dispatch_sync+DISPATCH_QUEUE_SERIAL 不會(huì)開啟新的線程且任務(wù)按順序執(zhí)行完。
主隊(duì)列: dispatch_get_main_queue + 異步 不管是不是并行還是串行,都會(huì)放至主線程中執(zhí)行!
???????????? dispatch_get_main_queue + 同步 會(huì)導(dǎo)致卡死。
GCD中保證代碼在整個(gè)程序中至運(yùn)行一次: dispatch_once(&onceToken,^ {
?????????? // 只運(yùn)行一次的代碼
});