现在有一个需求:某个页面中的数据是通过三个接口给出的,现在需要三个接口中的数据全部返回后再一起展示全部数据。
需求分析:1.我们要将三个网络请求放在新开辟的子线程。 2.为了提高效率要将三个网络请求采用异步请求的方式。 3.要确保三个网络请求结束以后再进行展示数据的操作。
当遇到这样的需求的时候我们可以利用GCD中的组(group)来实现。我们将每个线程操作放到组中,在所有的线程操作完成之后回到主线程中进行UI页面的刷新。代码:
// 全局变量group
dispatch_group_t group =dispatch_group_create();
// 并行队列
dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
// 进入组(进入组和离开组必须成对出现,否则会造成死锁)
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
// 执行异步任务1
[NSThreadsleepForTimeInterval:2];
for (int i =0; i < 3; i ++) {
NSLog(@"%d---%@", i, [NSThreadcurrentThread ]); //子线程
}
_str1 =@"str1";
dispatch_group_leave(group);
});
// 进入组
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
// 执行异步任务2
[NSThreadsleepForTimeInterval:2];
for (int i =3; i < 6; i ++) {
NSLog(@"%d---%@", i, [NSThreadcurrentThread ]);
}
_str2 =@"str2";
dispatch_group_leave(group);
});
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
NSLog(@"%@",_str1);
NSLog(@"%@",_str2);
NSLog(@"%@", [NSThreadcurrentThread]); //主线程
NSLog(@"完成...");
});
注意:代码中使用了dispatch_group_enter(group)和 dispatch_group_leave(group)是为了确保每个任务的完成,即使某个任务是异步的,在所有任务都完成后再执行notify中的代码。
方式二 :用 信号量检测
// 创建信号量
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
// 创建全局并行
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
// 请求一
[loginCode getUserInfoWithNick:nil andUserId:kUserId onSuc:^(id data) {
NSLog(@"yue");
dispatch_semaphore_signal(semaphore);
} andFail:^(NSError *error) {
}];
});
dispatch_group_async(group, queue, ^{
// 请求二
[CommodityViewModel getPriceTransformForIntegral:nil onSuccess:^(id data) {
NSLog(@"duihuan11");
dispatch_semaphore_signal(semaphore);
} onFailure:^(NSError *error) {
}];
});
dispatch_group_async(group, queue, ^{
// 请求三
[CommodityViewModel getPriceTransformForIntegral:nil onSuccess:^(id data) {
NSLog(@"duihuan22");
dispatch_semaphore_signal(semaphore);
} onFailure:^(NSError *error) {
}];
});
dispatch_group_notify(group, queue, ^{
// 三个请求对应三次信号等待
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
//在这里 进行请求后的方法,回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
//更新UI操作
});
});
相关 文档 :http://blog.csdn.net/a454431208/article/details/77070778
http://blog.csdn.net/cloudox_/article/details/71107179
网友评论