GCD (Grand Central Dispatch)
純C語(yǔ)言 ?GCD是蘋果的多核并行的運(yùn)算解決方案坚弱。
GCD的核心概念:
任務(wù):要執(zhí)行什么操作 ?GCD 自動(dòng)將隊(duì)列中的任務(wù)取出來(lái)
隊(duì)列:用來(lái)存放任務(wù)????FIFO ?先進(jìn)先出
queue ?是隊(duì)列 ?block 是要執(zhí)行的任務(wù)
同步:dispatch_sync ????同步任務(wù)是在當(dāng)前進(jìn)程中執(zhí)行的
異步:dispatch_async????可以開啟新的進(jìn)程
并發(fā)隊(duì)列:可以讓多個(gè)任務(wù)并發(fā)(同時(shí)執(zhí)行)派撕,自動(dòng)開啟多個(gè)線程;
并發(fā)功能只有在異步(dispatch_async)函數(shù)下才有效
穿行隊(duì)列:讓任務(wù)一個(gè)接一個(gè)的執(zhí)行荠卷。
易混淆的詞義解析:
并發(fā)和串行:任務(wù)的執(zhí)行方式
并發(fā):允許多任務(wù)并發(fā)(同事執(zhí)行)
串行:一個(gè)任務(wù)執(zhí)行完畢后,在執(zhí)行下一個(gè)任務(wù)
同步和異步:能不能開啟新的線程
同步:只能在當(dāng)前線程中執(zhí)行任務(wù)脑溢,不能開啟新的線程
異步:可以在新的新的線程中執(zhí)行僵朗,具備開啟新的線程的能力,但可能不開新線程(主隊(duì)列)
同步函數(shù)+并發(fā)隊(duì)列:不會(huì)開啟新的線程
同步函數(shù)+串行隊(duì)列:不會(huì)開啟新的線程屑彻,在當(dāng)前線程執(zhí)行任務(wù)验庙,
異步函數(shù)+串行隊(duì)列:會(huì)開啟新的線程,任務(wù)是串行執(zhí)行的
(耗時(shí)的操作需要用異步社牲,順序執(zhí)行需要用串行隊(duì)列)粪薛。
異步函數(shù)+主隊(duì)列:不會(huì)開啟新的線程,只會(huì)在主線程中執(zhí)行搏恤。
同步函數(shù)+主隊(duì)列:主線程的任務(wù)完成后才能執(zhí)行下面的函數(shù)违寿,這樣會(huì)讓線程阻塞。不會(huì)執(zhí)行下面的任務(wù)熟空。
// 1.獲得全局的并發(fā)隊(duì)列
dispatch_queue_tqueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
全局隊(duì)列就是并發(fā)隊(duì)列L俪病!息罗!
第一個(gè)參數(shù)是優(yōu)先級(jí)掂咒,第二個(gè)參數(shù)默認(rèn)為0就可以了。
利用這個(gè)獲取全局隊(duì)列的方法就不用考慮隊(duì)列的釋放迈喉。
(隊(duì)列釋放方法:dipatch_release(queue);)
串行隊(duì)列
一绍刮、使用dispatch_queue_t ?queue = dispatch_queue_create("#(隊(duì)列名)#",NULL); ?//這里的NULL 和DISPATCH_QUEUE_SERIAL一樣都是串行
二、主隊(duì)列:(用的比較多)
主隊(duì)列是GCD自帶的一種特殊的串行隊(duì)列
放在主隊(duì)列中的任務(wù)挨摸,都會(huì)放在主線程中執(zhí)行
使用dispatch_get_main_queue()獲取主隊(duì)列
異步函數(shù)是這段代碼函數(shù)執(zhí)行后才會(huì)執(zhí)行孩革,異步任務(wù)。
同步函數(shù)是這段代碼函數(shù)逐個(gè)順序執(zhí)行得运,執(zhí)行完后在執(zhí)行下一個(gè)膝蜈。
隔斷隊(duì)列
dispatch_barrier_async
隔斷隊(duì)列前的異步隊(duì)列全部完成后才會(huì)執(zhí)行后面的隔斷隊(duì)列。
延遲調(diào)用
1澈圈、dispatch_after
2彬檀、NSTimer
一次執(zhí)行函數(shù)(單例)
dispatch_once
??不能用于懶加載?