本文主要是介绍iOS开发中利用dispatch group实现并发多任务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
现在有一个需求:某个页面中的数据是通过三个接口给出的,现在需要三个接口中的数据全部返回后再一起展示全部数据。
需求分析: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中的代码。
这篇关于iOS开发中利用dispatch group实现并发多任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!