介紹一下主要的函數(shù)
1、dispatch_group_async
//將block加入到queue中,并和group相關(guān)聯(lián)
void dispatch_group_async(dispatch_group_t group,
dispatch_queue_t queue,
dispatch_block_t block);
如果提交到dispatch_queue_t queue中與group關(guān)聯(lián)的任務(wù)全都執(zhí)行完畢會(huì)調(diào)用dispatch_group_notify并且dispatch_group_wait會(huì)停止等待;
2、dispatch_group_enter & dispatch_group_leave
//將代碼塊加入到group中,與dispatch_group_async功能類似
//開始一個(gè)任務(wù)
void dispatch_group_enter(dispatch_group_t group);
//結(jié)束的任務(wù)
void dispatch_group_leave(dispatch_group_t group);
當(dāng)調(diào)用enter時(shí)計(jì)數(shù)加1,調(diào)用leave時(shí)計(jì)數(shù)減1,當(dāng)計(jì)數(shù)為0時(shí)會(huì)調(diào)用dispatch_group_notify并且dispatch_group_wait會(huì)停止等待;
注意點(diǎn): dispatch_group_enter 和 dispatch_group_leave 必須成對(duì)出現(xiàn)
3、dispatch_group_wait
//阻塞當(dāng)前線程(不能放在主線程)等待group任務(wù)的完成,可以設(shè)置超時(shí)時(shí)間
long dispatch_group_wait(dispatch_group_t group,
dispatch_time_t timeout);
4 、dispatch_group_notify
/* dispatch_group_notify會(huì)把block加入到queue中,
* 當(dāng)dispatch_group_t中的任務(wù)執(zhí)行完成時(shí)執(zhí)行
* 或者在dispatch_group_enter和dispatch_group_leave存在的情況下,計(jì)數(shù)為0的時(shí)候執(zhí)行
*/
void dispatch_group_notify(dispatch_group_t group,
dispatch_queue_t queue,
dispatch_block_t block);
示例1 dispatch_group的簡單使用:
dispatch_queue_t queue_t = dispatch_queue_create("gcd_demo_queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group_t = dispatch_group_create();
dispatch_group_async(group_t, queue_t, ^{
sleep(2);
NSLog(@"任務(wù)1完成");
});
dispatch_group_async(group_t, queue_t, ^{
sleep(3);
NSLog(@"任務(wù)2完成");
});
dispatch_group_async(group_t, queue_t, ^{
NSLog(@"任務(wù)3完成");
});
//任務(wù)完成方式一
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_group_wait(group_t, DISPATCH_TIME_FOREVER);
NSLog(@"任務(wù)完成通知 Wait");
});
//任務(wù)完成方式二
dispatch_group_notify(group_t, dispatch_get_main_queue(), ^{
NSLog(@"任務(wù)完成通知 Notify");
});
輸出結(jié)果
2018-01-04 14:10:15.884470+0800 GCD_Demo[2869:439062] 任務(wù)3完成
2018-01-04 14:10:17.886704+0800 GCD_Demo[2869:439063] 任務(wù)1完成
2018-01-04 14:10:18.887726+0800 GCD_Demo[2869:439061] 任務(wù)2完成
2018-01-04 14:10:18.887978+0800 GCD_Demo[2869:439060] 任務(wù)完成通知 Wait
2018-01-04 14:10:18.887988+0800 GCD_Demo[2869:439018] 任務(wù)完成通知 Notify
需要注意的是dispatch_group_wait會(huì)阻塞當(dāng)前線程,所以不能放到主線程
示例2 dispatch_group 多個(gè)queue的使用:
dispatch_queue_t queue_t = dispatch_queue_create("gcd_demo_queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue_global_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group_t = dispatch_group_create();
dispatch_group_async(group_t, queue_t, ^{
sleep(2);
NSLog(@"任務(wù)1完成");
});
dispatch_group_async(group_t, queue_t, ^{
sleep(3);
NSLog(@"任務(wù)2完成");
});
//任務(wù)3 在系統(tǒng)的線程中執(zhí)行
dispatch_group_async(group_t, queue_global_t, ^{
sleep(5);
NSLog(@"任務(wù)3完成");
});
dispatch_group_notify(group_t, dispatch_get_main_queue(), ^(){
NSLog(@"notify:任務(wù)都完成了");
});
輸出結(jié)果
2018-01-04 14:24:47.559384+0800 GCD_Demo[2998:488861] 任務(wù)1完成
2018-01-04 14:24:48.557911+0800 GCD_Demo[2998:488863] 任務(wù)2完成
2018-01-04 14:24:50.556268+0800 GCD_Demo[2998:488864] 任務(wù)3完成
2018-01-04 14:24:50.556476+0800 GCD_Demo[2998:488756] 任務(wù)完成通知
示例3 dispatch_group - dispatch_group_enter & dispatch_group_leave的使用:
dispatch_queue_t queue_t = dispatch_queue_create("gcd_demo_queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group_t = dispatch_group_create();
dispatch_group_enter(group_t);
dispatch_async(queue_t, ^{
sleep(5);
NSLog(@"網(wǎng)絡(luò)任務(wù)1完成");
dispatch_group_leave(group_t);
});
dispatch_group_enter(group_t);
dispatch_async(queue_t, ^{
sleep(3);
NSLog(@"網(wǎng)絡(luò)任務(wù)2完成");
dispatch_group_leave(group_t);
});
dispatch_group_enter(group_t);
dispatch_async(queue_t, ^{
sleep(4);
NSLog(@"網(wǎng)絡(luò)任務(wù)3完成");
dispatch_group_leave(group_t);
});
dispatch_group_notify(group_t, dispatch_get_main_queue(), ^{
NSLog(@"任務(wù)完成通知");
});
輸出結(jié)果
2018-01-04 14:33:10.374991+0800 GCD_Demo[3110:527082] 網(wǎng)絡(luò)任務(wù)2完成
2018-01-04 14:33:11.374908+0800 GCD_Demo[3110:527095] 網(wǎng)絡(luò)任務(wù)3完成
2018-01-04 14:33:12.375411+0800 GCD_Demo[3110:526266] 網(wǎng)絡(luò)任務(wù)1完成
2018-01-04 14:33:12.375620+0800 GCD_Demo[3110:526111] 任務(wù)完成通知