? GCD(Grand Central Dispatch)是iOS多任務(wù)的核心,廣泛應(yīng)用在iOS編程或者系統(tǒng)層面的各個(gè)方面。GCD是非常底層的框架,比操作隊(duì)列更底層。GCD嚴(yán)格遵守先進(jìn)先出(FIFO)結(jié)構(gòu),所以是無法在隊(duì)列中使用優(yōu)先級(jí)或者調(diào)整次序。
? 首先最重要的一點(diǎn),分派隊(duì)列是隊(duì)列,而不是線程。隊(duì)列是組織塊的,調(diào)用dispatch_async不會(huì)讓塊執(zhí)行,只是把塊添加到隊(duì)列中。GCD中隊(duì)列是有層級(jí)的,事實(shí)上只有全局系統(tǒng)隊(duì)列會(huì)被調(diào)度運(yùn)行,訪問方法是:dispatch_get_global_queue,以及下面優(yōu)先級(jí)常量中的一個(gè):
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND
? 這些隊(duì)列都是并行的,GCD會(huì)根據(jù)可用線程盡可能按優(yōu)先級(jí)調(diào)度隊(duì)列。當(dāng)我們創(chuàng)建隊(duì)列時(shí),隊(duì)列會(huì)附加到某一個(gè)全局隊(duì)列。默認(rèn)情況下會(huì)附加到默認(rèn)優(yōu)先級(jí)隊(duì)列上。當(dāng)塊到達(dá)頭部時(shí),實(shí)際上會(huì)移動(dòng)目標(biāo)隊(duì)列的末尾。當(dāng)?shù)竭_(dá)全局隊(duì)列的頭部時(shí)就會(huì)執(zhí)行。塊被添加后,就會(huì)按照順序運(yùn)行,無法取消,也無法改變相對(duì)于隊(duì)列中其他塊的順序。但是如果想讓高優(yōu)先級(jí)塊插隊(duì)呢?如下代碼。創(chuàng)建兩個(gè)隊(duì)列,一個(gè)高優(yōu)先級(jí)和一個(gè)低優(yōu)先級(jí),使高優(yōu)先級(jí)隊(duì)列是低優(yōu)先級(jí)隊(duì)列的目標(biāo)隊(duì)列:
dispatch_queue_t low = dispatch_queue_create("low",DISPATCH_QUEUE_SERIAL);
dispatch_queue_t high = dispatch_queue_create("high",DISPATCH_QUEUE_SERIAL);
dispatch_set_target_queue(low,high);
? 通常是分派到低優(yōu)先級(jí)隊(duì)列:
dispatch_async(low,^{/ 低優(yōu)先級(jí)塊 /});
? 要分派到高優(yōu)先級(jí)隊(duì)列,暫停低優(yōu)先級(jí)隊(duì)列,并且在高優(yōu)先級(jí)塊結(jié)束后恢復(fù)低優(yōu)先級(jí)隊(duì)列:
dispatch_suspend(low);
dispatch_async(high,^{
/ 高優(yōu)先級(jí)塊 /
dispatch_resume(low);
});
? 暫停隊(duì)列會(huì)組織調(diào)度開始就處于其中的任何塊,還有人和以暫停隊(duì)列為目標(biāo)隊(duì)列的隊(duì)列。這樣不會(huì)停止正在執(zhí)行的塊,但是就算低優(yōu)先級(jí)塊是CPU執(zhí)行的下個(gè)目標(biāo),也不會(huì)被調(diào)度,直到resume。suspend和resume必需配對(duì)出現(xiàn)。