在移动端开发中,通常有这种需求:
- 有一个页面里面分有几个模块
- 每个模块都有自己单独的接口,需要分开从服务端请求数据
- 每个模块请求时间又不一致,可能有的接口返回数据是有的,有的数据没有,最后页面加载完成后”残缺不全”,影响用户体验
dispatch_group_t可以很好的解决这个问题
dispatch_group_t是 GCD里面的一部分,它可以实现一些任务在特定的任务完成之后才执行1
2
3
4
5
6
7
8
9
10
11let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
let group = dispatch_group_create()
dispatch_group_async(group, queue) {
print("1")
}
dispatch_group_async(group, queue) {
print("2")
}
dispatch_group_notify(group, dispatch_get_main_queue()) {
print("3")
}
在上面的例子中 print(“1”)和print(“2”)因为是异步的可能先后顺序不一致,但是print(“3”)肯定是在print(“1”)和print(“2”)都执行完成之后才会执行
Warning
但是上述方法对于dispatch_group_async里面的闭包(OC中叫Block)是异步的网络请求是无效的,意思就是说如果dispatch_group_async里面的闭包(OC中叫Block)是异步的网络请求,dispatch_group_notify执行的时候,前面dispatch_group_async里面的异步网络请求可能还在执行中,导致dispatch_group_notify执行时候需要的数据为nil.此时下面两个函数(方法)就起到作用了,表示进入到group和离开group,记住它们两个是成对出现的
dispatch_group_enter(group)
dispatch_group_leave(group)
示例代码
1 | let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) |
这样就可以保证 执行dispatch_group_notify的时候, dispatch_group_asyn里面的异步请求都已经执行完成了.
最后重复一次:dispatch_group_enter(group)和dispatch_group_leave(group)是成对的—-成对的—–成对的