iOS多線程-GCD之Dispatch Group

上一篇 iOS多線程-GCD之dispatch_set_target_queue

一、釋義

//創(chuàng)建一個(gè)group
dispatch_group_t dispatch_group_create(void);

//將操作加入到group當(dāng)中
void dispatch_group_async(dispatch_group_t group,
    dispatch_queue_t queue,
    dispatch_block_t block);

//通知某個(gè)執(zhí)行隊(duì)列,group中的異步操作全部執(zhí)行完畢,可以追加其它操作
void dispatch_group_notify(dispatch_group_t group,
    dispatch_queue_t queue,
    dispatch_block_t block);

dispatch_group_create()會(huì)返回一個(gè)dispatch_group_t,只需要一個(gè)該類型的變量進(jìn)行接收,即可使用了。
dispatch_group_async()會(huì)將操作放入group中,它有三個(gè)參數(shù):

group----創(chuàng)建的group,這個(gè)group容納一些異步操作
queue----追加操作執(zhí)行的隊(duì)列
block----追加的操作(即代碼塊)
注意:它沒有對(duì)應(yīng)的 dispatch_group_sync()

dispatch_group_notify()會(huì)在group中操作執(zhí)行完畢后進(jìn)行一個(gè)通知,它有三個(gè)參數(shù):

group----進(jìn)行監(jiān)控的group
queue----group中操作執(zhí)行完畢后的執(zhí)行隊(duì)列
block----group中操作執(zhí)行完畢后再執(zhí)行的操作

二、示例

//獲取一個(gè)全局隊(duì)列
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//創(chuàng)建一個(gè)group
dispatch_group_t group = dispatch_group_create();

//在group執(zhí)行操作
dispatch_group_async(group, globalQueue, ^{ NSLog(@"1"); });
dispatch_group_async(group, globalQueue, ^{ NSLog(@"2"); });
dispatch_group_async(group, globalQueue, ^{ NSLog(@"3"); });
dispatch_group_async(group, globalQueue, ^{ NSLog(@"4"); });
dispatch_group_async(group, globalQueue, ^{ NSLog(@"5"); });

//group中的操作全部執(zhí)行完,通知隊(duì)列
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    NSLog(@"Done!");
});

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

2017-03-04 16:28:12.412 GCDLearn[918:46111] 1
2017-03-04 16:28:12.412 GCDLearn[918:46120] 5
2017-03-04 16:28:12.412 GCDLearn[918:46119] 4
2017-03-04 16:28:12.412 GCDLearn[918:46110] 2
2017-03-04 16:28:12.412 GCDLearn[918:46115] 3
2017-03-04 16:28:12.416 GCDLearn[918:45968] Done!

分析:在group作用下,前面數(shù)字輸出順序無論怎么變,Done都會(huì)在最后輸出。

三、dispatch_group_wait

//定義
long dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout);

第一個(gè)參數(shù)是一個(gè)group,第二個(gè)參數(shù)是一個(gè)dispatch_time類型的值,常用的有DISPATCH_TIME_FOREVER、DISPATCH_TIME_NOW。它會(huì)返回一個(gè)long類型的值,0代表執(zhí)行完畢,1代表未執(zhí)行完畢。

讓我們將上面代碼中 dispatch_group_notify()部分代碼替換成 dispatch_group_wait()

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_group_wait(group, DISPATCH_TIME_NOW);

當(dāng)參數(shù)是 DISPATCH_TIME_FOREVER 時(shí),程序會(huì)一直等待group中操作執(zhí)行完畢,所以它的返回值恒為0;
當(dāng)參數(shù)是 DISPATCH_TIME_NOW 時(shí),程序不會(huì)進(jìn)行任何等待就會(huì)去判斷group中的操作是否執(zhí)行完畢。

推薦使用 dispatch_group_notify()

GCD學(xué)習(xí)代碼 如果覺得有用,順便給顆星哦??
下一篇:iOS多線程-GCD之dispatch_barrier_async

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • iOS 多線程GCD之dispatch_group 本文通過介紹dispatch_group基本功能,通過實(shí)例講解...
    HK_Hank閱讀 12,844評(píng)論 6 19
  • 背景 擔(dān)心了兩周的我終于輪到去醫(yī)院做胃鏡檢查了!去的時(shí)候我都想好了最壞的可能(胃癌),之前在網(wǎng)上查的癥狀都很相似。...
    Dely閱讀 9,380評(píng)論 21 42
  • 1. GCD簡(jiǎn)介 什么是GCD呢?我們先來看看百度百科的解釋簡(jiǎn)單了解下概念 引自百度百科:Grand Centra...
    千尋_544f閱讀 495評(píng)論 0 0
  • iOS 多線程系列 -- 基礎(chǔ)概述iOS 多線程系列 -- pthreadiOS 多線程系列 -- NSThrea...
    shannoon閱讀 987評(píng)論 0 2
  • 在你的心里,可有著我不變的影子嗎? 我知道,人對(duì)水的依戀就如植物對(duì)土地的依戀;獵人對(duì)大山;漁人對(duì)江河的依戀;更如我...
    覃夢(mèng)云閱讀 220評(píng)論 0 1

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