? GCD(Grand Central Dispatch)是iOS多任務(wù)的核心,廣泛應(yīng)用在iOS編程或者系統(tǒng)層面的各個方面哄孤。GCD是非常底層的框架照筑,比操作隊列更底層。GCD嚴(yán)格遵守先進先出(FIFO)結(jié)構(gòu),所以是無法在隊列中使用優(yōu)先級或者調(diào)整次序凝危。
? 首先最重要的一點饭弓,分派隊列是隊列,而不是線程媒抠。隊列是組織塊的,調(diào)用dispatch_async不會讓塊執(zhí)行咏花,只是把塊添加到隊列中趴生。GCD中隊列是有層級的,事實上只有全局系統(tǒng)隊列會被調(diào)度運行昏翰,訪問方法是:dispatch_get_global_queue苍匆,以及下面優(yōu)先級常量中的一個:
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND
? 這些隊列都是并行的,GCD會根據(jù)可用線程盡可能按優(yōu)先級調(diào)度隊列棚菊。當(dāng)我們創(chuàng)建隊列時浸踩,隊列會附加到某一個全局隊列。默認情況下會附加到默認優(yōu)先級隊列上统求。當(dāng)塊到達頭部時检碗,實際上會移動目標(biāo)隊列的末尾。當(dāng)?shù)竭_全局隊列的頭部時就會執(zhí)行码邻。塊被添加后折剃,就會按照順序運行,無法取消像屋,也無法改變相對于隊列中其他塊的順序怕犁。但是如果想讓高優(yōu)先級塊插隊呢?如下代碼己莺。創(chuàng)建兩個隊列奏甫,一個高優(yōu)先級和一個低優(yōu)先級,使高優(yōu)先級隊列是低優(yōu)先級隊列的目標(biāo)隊列:
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)先級隊列:
dispatch_async(low,^{/ 低優(yōu)先級塊 /});
? 要分派到高優(yōu)先級隊列凌受,暫停低優(yōu)先級隊列阵子,并且在高優(yōu)先級塊結(jié)束后恢復(fù)低優(yōu)先級隊列:
dispatch_suspend(low);
dispatch_async(high,^{
/ 高優(yōu)先級塊 /
dispatch_resume(low);
});
? 暫停隊列會組織調(diào)度開始就處于其中的任何塊,還有人和以暫停隊列為目標(biāo)隊列的隊列胁艰。這樣不會停止正在執(zhí)行的塊款筑,但是就算低優(yōu)先級塊是CPU執(zhí)行的下個目標(biāo),也不會被調(diào)度腾么,直到resume奈梳。suspend和resume必需配對出現(xiàn)。