iOS 多線程 GCD

1楼眷、什么是 GCD 十性?

GCD 是蘋果公司為多核的并行運算提出的解決方案限佩,它基于 C 語言葵诈,全稱 Grand Central Dispatch裸弦,有人叫它“牛逼的中心調(diào)度”。

2作喘、GCD 用途

通過 GCD理疙,開發(fā)者不用再直接跟線程打交道了,只需要向隊列中添加代碼塊即可泞坦,GCD 在后端管理著一個線程池窖贤。GCD 不僅決定著你的代碼塊將在哪個線程被執(zhí)行,它還根據(jù)可用的系統(tǒng)資源對這些線程進行管理贰锁。這樣可以將開發(fā)者從線程管理的工作中解放出來赃梧,通過集中的管理線程,來緩解大量線程被創(chuàng)建的問題豌熄。

GCD 帶來的另一個重要改變是授嘀,作為開發(fā)者可以將工作考慮為一個隊列,而不是一堆線程锣险,這種并行的抽象模型更容易掌握和使用蹄皱。

首先睬愤,系統(tǒng)提供給你一個叫做 主隊列(main queue) 的特殊隊列悬赏。和其它串行隊列一樣,這個隊列中的任務(wù)一次只能執(zhí)行一個慢味。然而纷妆,它能保證所有的任務(wù)都在主線程執(zhí)行盔几,而主線程是唯一可用于更新 UI 的線程晴弃。這個隊列就是用于發(fā)生消息給 UIView 或發(fā)送通知的掩幢。

系統(tǒng)同時提供給你好幾個并發(fā)隊列。它們叫做 全局調(diào)度隊列(Global Dispatch Queues) 上鞠。目前的四個全局隊列有著不同的優(yōu)先級:background际邻、low、default 以及 high芍阎。要知道世曾,Apple 的 API 也會使用這些隊列,所以你添加的任何任務(wù)都不會是這些隊列中唯一的任務(wù)谴咸。

最后轮听,你也可以創(chuàng)建自己的串行隊列或并發(fā)隊列。這就是說岭佳,至少有五個隊列任你處置:主隊列血巍、四個全局調(diào)度隊列,再加上任何你自己創(chuàng)建的隊列珊随。

3述寡、GCD 術(shù)語
  • 串行(Serial):讓任務(wù)一個接著一個地執(zhí)行(one by one)
  • 并發(fā)(Concurrent):可以讓多個任務(wù)并發(fā)執(zhí)行(自動開啟多個線程柿隙,同時執(zhí)行任務(wù)),并發(fā)只有在異步(dispatch_async)函數(shù)下才有效
  • 同步(Synchronous):在當(dāng)前線程中執(zhí)行任務(wù)鲫凶,不具備開啟新線程的能力
  • 異步(Asynchronous):在新的線程中執(zhí)行任務(wù)禀崖,具備開啟新線程的能力
4、GCD 優(yōu)點
  • GCD 能通過推遲昂貴計算任務(wù)并在后臺運行它們來改善你的應(yīng)用的響應(yīng)性能螟炫。
  • GCD 提供一個易于使用的并發(fā)模型而不僅僅只是鎖和線程波附,幫助我們避開并發(fā)陷阱。
  • GCD 具有在常見模式(例如單例)上用更高性能的原語優(yōu)化你的代碼的潛在能力昼钻。
  • GCD 會自動利用更多的CPU內(nèi)核(比如雙核叶雹、四核)
5、GCD 使用
  • (1) 認識主隊列换吧,感受串行隊列的運行,運行結(jié)果打印的是 1折晦,2,3沾瓦,4满着,順序執(zhí)行
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{
    NSLog(@"1");
});
dispatch_async(mainQueue, ^{
    NSLog(@"2");
});
dispatch_async(mainQueue, ^{
    NSLog(@"3");
});
dispatch_async(mainQueue, ^{
    NSLog(@"4");
});
  • (2) 認識全局隊列,體驗并發(fā)隊列的運行贯莺,運行結(jié)果隨機打臃缋:2,3缕探,1魂莫,4,隨機執(zhí)行
dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(defaultQueue, ^{
    NSLog(@"1");
});
dispatch_async(defaultQueue, ^{
    NSLog(@"2");
});
dispatch_async(defaultQueue, ^{
    NSLog(@"3");
});
dispatch_async(defaultQueue, ^{
    NSLog(@"4");
});
  • (3) 創(chuàng)建自定義隊列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(concurrentQueue, ^{
    NSLog(@"4");
    dispatch_sync(concurrentQueue, ^{
        [NSThread sleepForTimeInterval:3];
        NSLog(@"5");
    });
    NSLog(@"6");
});
  • (4) GCD在單例中的運用 dispatch_once
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    NSLog(@"onceToken");
});
  • (5) 延遲加載 dispatch_after
double delayInSeconds = 2.0;
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW,delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, mainQueue, ^{
    NSLog(@"延時執(zhí)行的2秒");
});
  • (6) 調(diào)度組 dispatch_group_t
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, defaultQueue, ^{
    [NSThread sleepForTimeInterval:3];
    NSLog(@"1");
});
dispatch_group_async(group, defaultQueue, ^{
    [NSThread sleepForTimeInterval:2];
    NSLog(@"2");
});
dispatch_group_notify(group, defaultQueue, ^{
    NSLog(@"3");
});
    //    等價于    
//    dispatch_group_enter(group);
//    dispatch_async(defaultQueue, ^{
//
//        NSLog(@"1");
//        dispatch_group_leave(group);
//    });
  • (7) dispatch_barrier_async
    在前面的任務(wù)執(zhí)行結(jié)束后它才執(zhí)行爹耗,而且它后面的任務(wù)等它執(zhí)行完成之后才會執(zhí)行
dispatch_queue_t queue = dispatch_queue_create("barrierExecute", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
    [NSThread sleepForTimeInterval:2];
    NSLog(@"1");
});
dispatch_async(queue, ^{
    [NSThread sleepForTimeInterval:4];
    NSLog(@"2");
});
dispatch_barrier_async(queue, ^{
    NSLog(@"3");
    [NSThread sleepForTimeInterval:4];
    
});
dispatch_async(queue, ^{
    [NSThread sleepForTimeInterval:1];
    NSLog(@"4");
});
  • (8) 執(zhí)行某個代碼 dispatch_apply
dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_apply(5, defaultQueue, ^(size_t i) {
        NSLog(@"%lu",i);
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耙考,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子潭兽,更是在濱河造成了極大的恐慌倦始,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件山卦,死亡現(xiàn)場離奇詭異鞋邑,居然都是意外死亡,警方通過查閱死者的電腦和手機账蓉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門枚碗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铸本,你說我怎么就攤上這事肮雨。” “怎么了归敬?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵酷含,是天一觀的道長鄙早。 經(jīng)常有香客問我,道長椅亚,這世上最難降的妖魔是什么限番? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮呀舔,結(jié)果婚禮上弥虐,老公的妹妹穿的比我還像新娘。我一直安慰自己媚赖,他們只是感情好霜瘪,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惧磺,像睡著了一般颖对。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上磨隘,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天缤底,我揣著相機與錄音,去河邊找鬼番捂。 笑死个唧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的设预。 我是一名探鬼主播徙歼,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鳖枕!你這毒婦竟也來了魄梯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤耕魄,失蹤者是張志新(化名)和其女友劉穎画恰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吸奴,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年缠局,在試婚紗的時候發(fā)現(xiàn)自己被綠了则奥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡狭园,死狀恐怖读处,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情唱矛,我是刑警寧澤罚舱,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布井辜,位于F島的核電站,受9級特大地震影響管闷,放射性物質(zhì)發(fā)生泄漏粥脚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一包个、第九天 我趴在偏房一處隱蔽的房頂上張望刷允。 院中可真熱鬧,春花似錦碧囊、人聲如沸树灶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽天通。三九已至,卻和暖如春熄驼,著一層夾襖步出監(jiān)牢的瞬間土砂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工谜洽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萝映,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓阐虚,卻偏偏與公主長得像序臂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子实束,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 多線程學(xué)習(xí)筆記-GCD 我把這篇文章所用到的代碼總結(jié)到這里->GCD項目總結(jié)下載地址-GCD-wxk可以下載參考 ...
    wxkkkkk閱讀 537評論 0 2
  • 目錄:iOS多線程(一)--pthread奥秆、NSThreadiOS多線程(二)--GCD詳解iOS多線程(三)--...
    Claire_wu閱讀 1,077評論 0 6
  • 一、基本概念 線程是用來執(zhí)行任務(wù)的审胸,線程徹底執(zhí)行完任務(wù)A才能執(zhí)行任務(wù)B亥宿,為了同時執(zhí)行兩個任務(wù),產(chǎn)生了多線程 1砂沛、進...
    空白Null閱讀 687評論 0 3
  • 前言 嘿嘿嘿烫扼,精品。 概述 全稱是Grand Central Dispatch碍庵,可譯為“牛逼的中樞調(diào)度器”映企。純C語...
    Ostkaka丶閱讀 1,105評論 0 12
  • 我希望 當(dāng)秋風(fēng)轉(zhuǎn)涼時 有一個人 如八月暖陽 阻擋這寒冷 只為我一個人 我希望 當(dāng)秋雨淅瀝時 有一個人 如八月暖陽 ...
    滿升閱讀 188評論 5 2