參考博客:https://www.cnblogs.com/zhou--fei/p/6747938.html
一题山、dispatch_group_t相關(guān)屬性介紹
1.dispatch_group_async(group, queue, block);將block任務(wù)添加到queue隊(duì)列罪针,并被group組管理
2.dispatch_group_enter(group);
聲明dispatch_group_enter(group)下面的任務(wù)由group組管理膳算,group組的任務(wù)數(shù)+1
3.dispatch_group_leave(group);
相應(yīng)的任務(wù)執(zhí)行完成,group組的任務(wù)數(shù)-1
4.dispatch_group_create();
創(chuàng)建一個(gè)group組
5.dispatch_group_wait(group1,DISPATCH_TIME_FOREVER);
當(dāng)前線程暫停皮胡,等待dispatch_group_wait(group1, DISPATCH_TIME_FOREVER)上面的
任務(wù)執(zhí)行完成后童太,線程才繼續(xù)執(zhí)行。
6.dispatch_group_notify(group1,queue1,block);
監(jiān)聽group組中任務(wù)的完成狀態(tài)于樟,當(dāng)所有的任務(wù)都執(zhí)行完成后,觸發(fā)block塊拇囊,執(zhí)行總結(jié)性處
理迂曲。
二、常見用法的區(qū)別
1寥袭、dispatch_group_async(group, queue, block)和dispatch_group_notify(group1,
queue1,block)組合
這種組合下在執(zhí)行同步任務(wù)時(shí)正常路捧,但是不能保證queue中人物的執(zhí)行順序
在執(zhí)行異步任務(wù)時(shí)不正常,會(huì)出現(xiàn)先執(zhí)行dispatch_group_notify的情況
同步任務(wù):
dispatch_queue_t queue1 =
dispatch_queue_create("dispatchGroupMethod1.queue1",
DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group1 =dispatch_group_create();
dispatch_group_async(group1, queue1, ^{
dispatch_sync(queue1, ^{
for(NSInteger i =0; i<3; i++) {
sleep(1);
NSLog(@"%@-同步任務(wù)執(zhí)行-:%ld",@"任務(wù)1",(long)i);
}
});
});
dispatch_group_async(group1, queue1, ^{
dispatch_sync(queue1, ^{
for(NSInteger i =0; i<3; i++) {
sleep(1);
NSLog(@"%@-同步任務(wù)執(zhí)行-:%ld",@"任務(wù)2",(long)i);
}
});
});
//等待上面的任務(wù)全部完成后传黄,會(huì)收到通知執(zhí)行block中的代碼(不會(huì)阻塞線程)
dispatch_group_notify(group1, queue1,^{
NSLog(@"Method1-全部任務(wù)執(zhí)行完成");
});
2鬓长、dispatch_group_enter(group)和dispatch_group_leave(group)和
dispatch_group_notify(group1, queue1,block)組合
該組合下執(zhí)行同步任務(wù)正常,可以使得queue中的任務(wù)block按照添加順序依次執(zhí)行
執(zhí)行異步任務(wù)正常尝江,但是不能保證queue中人物的執(zhí)行順序
同步任務(wù)代碼
dispatch_queue_t queue2 =
dispatch_queue_create("dispatchGroupMethod2.queue2",
DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group2 = dispatch_group_create();
dispatch_group_enter(group2);
dispatch_sync(queue2, ^{
for(NSInteger i =0; i<3; i++) {
sleep(1);
NSLog(@"%@-同步任務(wù)執(zhí)行-:%ld",@"任務(wù)1",(long)i);
}
dispatch_group_leave(group2);
});
dispatch_group_enter(group2);
dispatch_sync(queue2, ^{
for(NSInteger i =0; i<3; i++) {
sleep(1);
NSLog(@"%@-同步任務(wù)執(zhí)行-:%ld",@"任務(wù)2",(long)i);
}
dispatch_group_leave(group2);
});
//等待上面的任務(wù)全部完成后涉波,會(huì)收到通知執(zhí)行block中的代碼(不會(huì)阻塞線程)
dispatch_group_notify(group2, queue2, ^{
NSLog(@"Method2-全部任務(wù)執(zhí)行完成");
});