dispatch_group_enter:通知group,下面的任务马上要放到group中执行了。
dispatch_group_leave:通知group,任务完成了,该任务要从group中移除了。
基于enter和leave,可以实现
demo中的需求是 两个网络请求可有可无都是判断往下一步走的条件,如果两个都是NO,则不判断直接走下一步,思路就是,在每一个网络请求结束之后,返回一个状态
#pragma mark - 网络请求 同步
- (void)loadRequest:(BOOL)firAdd secAdd:(BOOL)secAdd
{
__block int ifRefresh = 0;
dispatch_group_t dispatchGroup = dispatch_group_create();
if (firAdd) {
dispatch_group_enter(dispatchGroup);
[self httpRequest:^{
NSLog(@"第一个请求完成成功");
ifRefresh ++;
dispatch_group_leave(dispatchGroup);
} fail:^{
NSLog(@"第一个请求完成失败");
dispatch_group_leave(dispatchGroup);
}];
}
if (secAdd) {
dispatch_group_enter(dispatchGroup);
[self httpRequestNum:^{
NSLog(@"第二个请求完成成功");
ifRefresh ++;
dispatch_group_leave(dispatchGroup);
} fail:^{
NSLog(@"第二个请求完成失败");
dispatch_group_leave(dispatchGroup);
}];
}
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
NSLog(@"请求完成");
if (ifRefresh == ((firAdd?0:1)+(secAdd?0:1))) {
NSLog(@"刷新");
}
else
{
NSLog(@"不刷新");
}
});
}
代码如下:
-(void)httpRequest:(void (^)(void))succ fail:(void (^)(void))fail{
if (num>5) {
succ();
}
else{
fail();
}
}
-(void)httpRequestNum:(void (^)(void))succ fail:(void (^)(void))fail{
sleep(5);
if (num>5) {
succ();
}
else{
fail();
}
}
此处用随机数模拟是否成功失败,sleep5当做网络请求的延时,无论成功失败,都要返回,告知请求结束。
项目参考代码:https://github.com/Rain-wz/asynTest.git