今天我们来说说dispatch_group在开发过程中的应用。
- 我决定每篇文章的开头都会放上福利。
![0QE1_)${@(K3]~HO]@HT]E5.jpg](http:https://img.haomeiwen.com/i1436009/b226ccaab07aac58.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
在实际开发中我们会遇到这样一种需求:某个页面加载时通过网络请求获得相应的数据,再做某些操作,有时候加载的内容需要通过好几个接口的数据组合而成,比如有两个请求A和B,我们通常为了省事,会将B请求放在A请求成功的回调中发起,在B的成功回调中将数据组合起来,这样做有明显的问题:
- 请求如果多了,需要写许多嵌套的请求
- 如果在除了最后一个请求前的某个请求失败了,就不会执行后面的请求,数据无法加载
- 请求变成同步的,这是最大的问题,在网络差的情况下,如果有n个请求,意味着用户要等待n倍于并发请求的时间才能看到内容。
接下来我们就来解决这个问题。
dispatch_group_wait
dispatch_group_wait会同步地等待group中所有的block执行完毕后才继续执行
NSLog(@"第一个执行");
// 创建一个group
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,queue,^{
NSLog(@"线程1");
});
dispatch_group_async(group,queue,^{
NSLog(@"线程2");
});
dispatch_group_wait(group,DISPATCH_TIME_FOREVER);
NSLog(@"走后执行");
执行结果
Paste_Image.png dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,queue,^{
NSLog(@"线程一");
});
dispatch_group_async(group,queue,^{
NSLog(@"线程二");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"一和二完成");
});
NSLog(@"异步执行");
执行结果
Paste_Image.pngdispatch_group_enter dispatch_group_leave
// 创建一个group
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"线程一");
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"线程二");
dispatch_group_leave(group);
});
//等待group完成所有异步操作
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"一二俩个执行完最后走");
});
NSLog(@"异步执行");
执行结果
Paste_Image.png // 下面两种方法是相同的 没发现什么区别
dispatch_group_async(group, queue, ^{
});
dispatch_group_enter(group);dispatch_async(queue, ^{
dispatch_group_leave(group);
});
网友评论