承接 iOS多线程GCD深入之Dispatch Group介绍
例子一.网络访问同步
我们在写代码的时候应该有这样的情况,一个VC中可能需要两次请求网络,获得数据什么的,如果我们想在这两次网络请求全部结束后,更新UI等操作怎么办?这时候就可以用到dispatch group。上代码:
//创建group
dispatch_group_t groupT = dispatch_group_create();
//添加 第一次网络请求block
dispatch_group_enter(groupT);
[manager POST:testUrl parameters:_parameters progress:^(NSProgress * _Nonnull uploadProgress) {}
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject){
NSLog(@"post 1 done");
dispatch_group_leave(groupT); //第一次请求执行完成leave
}failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"fail");
dispatch_group_leave(groupT); //第一次请求执行完成leave
}];
AFHTTPSessionManager *manager2 = [AFHTTPSessionManager manager];
manager2.requestSerializer = [AFHTTPRequestSerializer serializer];
[manager2.requestSerializer setTimeoutInterval:40];
//添加 第二次网络请求block
dispatch_group_enter(groupT);
[manager2 POST:testUrl parameters:_parameters progress:^(NSProgress * _Nonnull uploadProgress) {}
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject){
NSLog(@"post 2 done");
dispatch_group_leave(groupT); //第二次请求执行完成leave
}failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"fail");
dispatch_group_leave(groupT); //第二次请求执行完成leave
}];
dispatch_group_notify(groupT, dispatch_get_main_queue() , ^{NSLog(@"all is done");});
NSLog(@"main");
输出结果:
2017-02-14 14:17:15.873 NodeLearn[3471:115204] main
2017-02-14 14:17:15.899 NodeLearn[3471:115204] post 1 done
2017-02-14 14:17:15.899 NodeLearn[3471:115204] post 2 done
2017-02-14 14:17:15.900 NodeLearn[3471:115204] all is done可以看到网络post请求相对于主线程来说是异步的,但是dipatch_group_notify函数添加的block与两次网络请求是同步的,只有在两次网络请求都完成后,才执行,大家也可以在网络请求block中加的延时什么的看下效果。
iOS GCD DispatchGroup 使用示例
本文通过具体示例介绍了如何使用 iOS 中的 GCD DispatchGroup 来确保多个异步任务(如网络请求)完成后统一执行某个操作,这对于同步等待多个异步任务完成场景非常有用。
3054

被折叠的 条评论
为什么被折叠?



