常用的幾個(gè)方法
- dispatch_group_enter :通知 group,下個(gè)任務(wù)要放入 group 中執(zhí)行了
- dispatch_group_leave: 通知 group,任務(wù)成功完成,要移除,與 enter成對(duì)出現(xiàn)
- dispatch_group_wait: 在任務(wù)組完成時(shí)調(diào)用尤溜,或者任務(wù)組超時(shí)是調(diào)用(完成指的是enter和leave次數(shù)一樣多)
- dispatch_group_notify: 只要任務(wù)全部完成了,就會(huì)在最后調(diào)用
具體情況分析
實(shí)際應(yīng)用
我們就可以使用dispatch_group_enter了,在執(zhí)行了多段之后再在 notify 中執(zhí)行另一個(gè),類似于柵欄的效果.但是如果是網(wǎng)絡(luò)請(qǐng)求,需要達(dá)到網(wǎng)絡(luò)請(qǐng)求嵌套的效果,A網(wǎng)絡(luò)請(qǐng)求完之后再請(qǐng)求 B,需要添加dispatch_group_wait
,讓線程等待 A 執(zhí)行完成之后再執(zhí)行 B.
// A 請(qǐng)求數(shù)據(jù)
- (void)loadADataFinished:(void(^)(BOOL success))finished;
// B 請(qǐng)求數(shù)據(jù)
- (void)loadBDataFinished:(void(^)(BOOL success))finished;
// C 請(qǐng)求數(shù)據(jù)
- (void)loadCDataFinished:(void(^)(BOOL success))finished;
// 請(qǐng)求是否全部完成
- (void)finishedDataFinished:(void(^)(BOOL success))finished{
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
[self loadADataFinished:^(BOOL success){
if (success){
dispatch_group_leave(group);
}else{
finished(NO);
}
}];
dispatch_group_enter(group);
[self loadBDataFinished:^(BOOL success){
if (success){
dispatch_group_leave(group);
}else{
finished(NO);
}
}];
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);// A,B同時(shí)執(zhí)行, 執(zhí)行完才會(huì)執(zhí)行下面的 C
dispatch_group_enter(group);
[self loadCDataFinished:^(BOOL success){
if (success){
dispatch_group_leave(group);
}else{
finished(NO);
}
}];
// group 中的任務(wù)都成功完成后,才會(huì)返回 YES
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
finished(YES);
});
}
在我們的項(xiàng)目中,在一個(gè) VC 中會(huì)有多個(gè)網(wǎng)絡(luò)請(qǐng)求A,B.現(xiàn)在要實(shí)現(xiàn)的是:A 請(qǐng)求數(shù)據(jù)成功之后,再執(zhí)行 B 的網(wǎng)絡(luò)請(qǐng)求.這時(shí)候因?yàn)榫W(wǎng)絡(luò)請(qǐng)求是異步的,所以我們要達(dá)到效果,需要在子線程中加入信號(hào)量dispatch_semaphore_t
,在網(wǎng)絡(luò)請(qǐng)求內(nèi)部標(biāo)記信號(hào)量,請(qǐng)求完成之后將信號(hào)量清為 0.
// A 請(qǐng)求數(shù)據(jù)
- (void)loadADataFinished:(void(^)(BOOL success))finished;
// B 請(qǐng)求數(shù)據(jù)
- (void)loadBDataFinished:(void(^)(BOOL success))finished;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[self loadADataFinished:^(BOOL success){
if (success){
}else{
finished(NO);
}
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); // A請(qǐng)求完成之后,請(qǐng)求 B
[self loadBDataFinished:^(BOOL success){
if (success){
}else{
finished(NO);
}
dispatch_semaphore_signal(semaphore);
}];
});
其他情況可以參考:GCD 的控制使用