什么是GCD
概述:
Grand Central Dispatch (GCD)包括語(yǔ)言特性钳恕、運(yùn)行時(shí)庫(kù)和系統(tǒng)增強(qiáng)炼彪,它們提供了系統(tǒng)的全面改進(jìn)哄辣,支持在macOS请梢、iOS、watchOS和tvOS中的多核硬件上并發(fā)代碼執(zhí)行柔滔。
BSD子系統(tǒng)溢陪、Core Foundation和Cocoa api都得到了擴(kuò)展,可以使用這些增強(qiáng)來(lái)幫助系統(tǒng)和應(yīng)用程序更快睛廊、更有效地運(yùn)行,并提高響應(yīng)能力杉编〕考慮一下咆霜,對(duì)于一個(gè)應(yīng)用程序來(lái)說(shuō),有效地使用多個(gè)核是多么困難嘶朱,更不用說(shuō)在具有不同數(shù)量計(jì)算核的不同計(jì)算機(jī)上或在多個(gè)應(yīng)用程序爭(zhēng)奪這些核的環(huán)境中進(jìn)行操作了蛾坯。GCD在系統(tǒng)級(jí)別上運(yùn)行,可以更好地適應(yīng)所有正在運(yùn)行的應(yīng)用程序的需要疏遏,以一種平衡的方式將它們與可用的系統(tǒng)資源進(jìn)行匹配脉课。
調(diào)度對(duì)象和圓弧
當(dāng)你使用Objective-C編譯器構(gòu)建應(yīng)用時(shí),所有分派對(duì)象都是Objective-C對(duì)象财异。因此倘零,當(dāng)啟用自動(dòng)引用計(jì)數(shù)(ARC)時(shí),分派對(duì)象會(huì)像任何其他Objective-C對(duì)象一樣被保留并自動(dòng)釋放戳寸。在不啟用ARC時(shí)呈驶,使用dispatch_retain和dispatch_release函數(shù)(或Objective-C語(yǔ)義)來(lái)保留和釋放分派對(duì)象。您不能使用Core Foundation retain/release函數(shù)疫鹊。
如果您需要在一個(gè)支持arc的應(yīng)用程序中使用retain/release語(yǔ)義袖瞻,并在稍后的部署目標(biāo)中使用(為了維護(hù)與現(xiàn)有代碼的兼容性),您可以通過(guò)向編譯器標(biāo)志添加-DOS_OBJECT_USE_OBJC=0來(lái)禁用基于objective - c的分派對(duì)象拆吆。
/*
隊(duì)列執(zhí)行的優(yōu)先級(jí)
@typedef dispatch_queue_priority_t
類(lèi)型的dispatch_queue_priority
@constant DISPATCH_QUEUE_PRIORITY_HIGH
分配到隊(duì)列的項(xiàng)將以高優(yōu)先級(jí)運(yùn)行聋迎,
也就是說(shuō),隊(duì)列將在之前被調(diào)度執(zhí)行
任何默認(rèn)優(yōu)先級(jí)或低優(yōu)先級(jí)隊(duì)列枣耀。
@constant DISPATCH_QUEUE_PRIORITY_DEFAULT
分派到隊(duì)列的項(xiàng)將在默認(rèn)情況下運(yùn)行
優(yōu)先級(jí)霉晕,即隊(duì)列將被調(diào)度以執(zhí)行
在調(diào)度了所有高優(yōu)先級(jí)隊(duì)列之后,但是
在調(diào)度任何低優(yōu)先級(jí)隊(duì)列之前奕枢。
@constant DISPATCH_QUEUE_PRIORITY_LOW
分配到隊(duì)列的項(xiàng)將以低優(yōu)先級(jí)運(yùn)行娄昆,
也就是說(shuō),隊(duì)列最終將被調(diào)度執(zhí)行
默認(rèn)優(yōu)先級(jí)和高優(yōu)先級(jí)隊(duì)列已經(jīng)
預(yù)定缝彬。
@constant DISPATCH_QUEUE_PRIORITY_BACKGROUND
分配到隊(duì)列的項(xiàng)將以后臺(tái)優(yōu)先級(jí)i運(yùn)行
將在所有高優(yōu)先級(jí)隊(duì)列之后調(diào)度執(zhí)行嗎
計(jì)劃萌焰,系統(tǒng)將運(yùn)行項(xiàng)目在這個(gè)隊(duì)列上的一個(gè)threa
根據(jù)setpriority(2)(即磁盤(pán)I/O是thrott)的后臺(tái)狀態(tài)
線(xiàn)程的調(diào)度優(yōu)先級(jí)設(shè)置為最小值)。
最后總結(jié):
DISPATCH_QUEUE_PRIORITY_HIGH高優(yōu)先級(jí)運(yùn)行
DISPATCH_QUEUE_PRIORITY_DEFAULT 默認(rèn)優(yōu)先級(jí)
DISPATCH_QUEUE_PRIORITY_LOW低優(yōu)先級(jí)運(yùn)行
DISPATCH_QUEUE_PRIORITY_BACKGROUND后臺(tái)優(yōu)先級(jí)i運(yùn)行
*/
dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
for (int i=0; i<10000; i++) {
NSLog(@"線(xiàn)程==%@ 打印數(shù)據(jù)==%d",[NSThread currentThread],i);
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i=0; i<10000; i++) {
NSLog(@"異步線(xiàn)程==%@ 打印數(shù)據(jù)==%d",[NSThread currentThread],i);
}
});
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i=0; i<10000; i++) {
NSLog(@"同步線(xiàn)程==%@ 打印數(shù)據(jù)==%d",[NSThread currentThread],i);
}
});
/*
打印結(jié)果
同步線(xiàn)程==<NSThread: 0x600000dc1400>{number = 1, name = main} 打印數(shù)據(jù)==0
線(xiàn)程==<NSThread: 0x600000d95bc0>{number = 3, name = (null)} 打印數(shù)據(jù)==0
異步線(xiàn)程==<NSThread: 0x600000d92b80>{number = 4, name = (null)} 打印數(shù)據(jù)==0
*/