dispatch_group的理解及使用

關(guān)于dispatch_group的概念以及幾種場景下的使用

1、關(guān)于dispatch_group

把一組任務(wù)提交到隊列中启搂,這些隊列可以不相關(guān)撵儿,然后監(jiān)聽這組任務(wù)完成的事件。

最常見的幾個方法:

1狐血、dispatch_group_create創(chuàng)建一個調(diào)度任務(wù)組
2淀歇、dispatch_group_async 把一個任務(wù)異步提交到任務(wù)組里
3、dispatch_group_enter/dispatch_group_leave 這種方式用在不使用dispatch_group_async來提交任務(wù)匈织,且必須配合使用
4浪默、dispatch_group_notify 用來監(jiān)聽任務(wù)組事件的執(zhí)行完畢
5、dispatch_group_wait 設(shè)置等待時間缀匕,在等待時間結(jié)束后纳决,如果還沒有執(zhí)行完任務(wù)組,則返回乡小。返回0代表執(zhí)行成功阔加,非0則執(zhí)行失敗

2、實際使用場景

場景1:

現(xiàn)在有4個任務(wù)满钟,任務(wù)1胜榔、任務(wù)2、任務(wù)3湃番、任務(wù)4. 任務(wù)3必須在任務(wù)2之后夭织,任務(wù)4必須在前3個任務(wù)都執(zhí)行完成后,才能執(zhí)行吠撮,并且需要在主線程更新UI尊惰。

思路分析:

任務(wù)3必須在任務(wù)2之后,所以這兩個必須串行執(zhí)行泥兰,同時弄屡,任務(wù)2和3整體可以和任務(wù)1并行執(zhí)行,最后鞋诗,任務(wù)4只能等待前3個任務(wù)全部執(zhí)行完成膀捷,才能執(zhí)行。這里就可以用group快速實現(xiàn)場景需求师脂。

代碼實現(xiàn):

-(void)disGroup{
    dispatch_queue_t globalQuene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_queue_t selfQuene = dispatch_queue_create("myQuene", 0);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, globalQuene, ^{
        NSLog(@"run task 1");
    });
    dispatch_group_async(group, selfQuene, ^{
        NSLog(@"run task 2");
    });
    dispatch_group_async(group, selfQuene, ^{
        NSLog(@"run task 3");
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"run task 4");
    });
}

執(zhí)行結(jié)果如下:(結(jié)果1和結(jié)果2是一樣的担孔,只是1和2的順序區(qū)別)
結(jié)果1


511196-20170111145515681-135501816.png


結(jié)果2


511196-20170111145437041-1603098500.png

總結(jié): 1和(2、3)是并行執(zhí)行關(guān)系吃警,2糕篇、3是串行執(zhí)行關(guān)系,且3肯定在2之后酌心,而4在(1拌消、2、3)全部完成之后才會執(zhí)行安券。

2墩崩、dispatch_group_enter(group)、dispatch_group_leave(group) 何時使用

理論上講侯勉,這兩個方法其實就是:手動管理group關(guān)聯(lián)的block的運行狀態(tài)(或計數(shù))鹦筹,并且使用時必須保證進入和退出group次數(shù)匹配。

所以:A和B兩種使用方式可以講是等價的

A)
dispatch_group_async(group, queue, ^{
  // 址貌。铐拐。。
});
 
B)
dispatch_group_enter(group);
dispatch_async(queue, ^{
  //练对。遍蟋。。
  dispatch_group_leave(group);
});

所以螟凭,這種用法和直接使用dispatch_group_notify一定程度上是等價的虚青,大家可以自己選擇使用。

場景2:

有3個異步請求任務(wù)螺男,任務(wù)1棒厘、2、3下隧,在3個任務(wù)全部完成之后绊谭,需要執(zhí)行任務(wù)4,用以顯示界面數(shù)據(jù)汪拥。

用 dispatch_group_enter达传、 dispatch_group_leave 實現(xiàn):

-(void)disGroupEnterAndLeave{
    dispatch_queue_t globalQuene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
     
    //任務(wù)1
    dispatch_group_enter(group);
    dispatch_async(globalQuene, ^{
         NSLog(@"run task 1");
        sleep(1);
        dispatch_group_leave(group);
    });
     
    //任務(wù)2
    dispatch_group_enter(group);
    dispatch_async(globalQuene, ^{
        NSLog(@"run task 2");
        sleep(2);
        dispatch_group_leave(group);
    });
     
    //任務(wù)3
    dispatch_group_enter(group);
    dispatch_async(globalQuene, ^{
        NSLog(@"run task 3");
        sleep(3);
        dispatch_group_leave(group);
    });
     
    //一直等待完成
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
   
    //任務(wù)3
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"run task 4");
    });
     
}

執(zhí)行結(jié)果:


511196-20170111153500806-1920974589.png

3個任務(wù)是并行執(zhí)行,且一共花費3s執(zhí)行迫筑,然后才執(zhí)行任務(wù)4宪赶。

當然,如果這樣想串行執(zhí)行3個任務(wù)脯燃,只需要把 全局隊列 換成 自定義隊列 即可搂妻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辕棚,隨后出現(xiàn)的幾起案子欲主,更是在濱河造成了極大的恐慌邓厕,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扁瓢,死亡現(xiàn)場離奇詭異详恼,居然都是意外死亡,警方通過查閱死者的電腦和手機引几,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門昧互,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伟桅,你說我怎么就攤上這事敞掘。” “怎么了楣铁?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵玖雁,是天一觀的道長。 經(jīng)常有香客問我盖腕,道長茄菊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任赊堪,我火速辦了婚禮面殖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哭廉。我一直安慰自己脊僚,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布遵绰。 她就那樣靜靜地躺著辽幌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪椿访。 梳的紋絲不亂的頭發(fā)上乌企,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音成玫,去河邊找鬼加酵。 笑死,一個胖子當著我的面吹牛哭当,可吹牛的內(nèi)容都是我干的猪腕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钦勘,長吁一口氣:“原來是場噩夢啊……” “哼陋葡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起彻采,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腐缤,失蹤者是張志新(化名)和其女友劉穎捌归,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岭粤,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡惜索,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年仆救,在試婚紗的時候發(fā)現(xiàn)自己被綠了失驶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖偿渡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霸奕,我是刑警寧澤溜宽,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站质帅,受9級特大地震影響适揉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜煤惩,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一嫉嘀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧魄揉,春花似錦剪侮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兵怯,卻和暖如春彩匕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背媒区。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工驼仪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袜漩。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓谅畅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親噪服。 傳聞我的和親對象是個殘疾皇子毡泻,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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