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