上一篇 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