承接 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中加的延时什么的看下效果。