GCD

什么是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
*/
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS多線程的方法有3種: NSThread NSOperation GCD(Grand Central Disp...
    啊左閱讀 2,876評論 5 11
  • 1.NSTimer不準(zhǔn)時的原因:(1).RunLoop循環(huán)處理時間,每次循環(huán)是固定時間,只有在這段時間才會去查看N...
    稻春閱讀 1,360評論 0 3
  • 很久前的總結(jié),今天貼出來。適合看了就用,很少講解,純粹用法。 目錄 Dispatch Queue dispatch...
    和女神經(jīng)常玩閱讀 780評論 0 3
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹 對...
    cosWriter閱讀 11,629評論 1 32
  • 第二十三章 安暖 慕瑤汐一回到家就聽見自家爸媽在討論著什么,還時不時地傳出一陣笑聲,一問才知道是翟毅來過了。 原...
    殤祁祁閱讀 301評論 0 1

友情鏈接更多精彩內(nèi)容