DispatchGroup踩过的坑
程序员文章站
2022-04-22 08:21:25
...
DispatchGroup踩过的坑
需求: 一个页面有四个网络请求, 四个网络请求结束后进行界面刷新. 我们首先想到的是使用DispatchGroup,下面是我的测试代码
let group = DispatchGroup()
let queue = DispatchQueue.global()
//banner数据
queue.async(group: group) {
NetworkUtil.shared.getForJSON(url: allBannerUrl, paramters: nil, finished: { (json, error) in
kLog("1")
})
}
//所有人
queue.async(group: group) {
NetworkUtil.shared.getForJSON(url: allQuestionUrl, paramters: nil, finished: { (json, error) in
kLog("2")
})
}
//热门作家
queue.async(group: group) {
NetworkUtil.shared.getForJSON(url: hotAuthorUrl, paramters: nil, finished: { (json, error) in
kLog("3")
})
}
//专题
queue.async(group: group) {
NetworkUtil.shared.getForJSON(url: allTopicUrl, paramters: nil, finished: { (json, error) in
kLog("4")
})
}
group.notify(queue: DispatchQueue.main) {
kLog("完成")
}
输出结果如图:
![输出结果](http://upload-images.jianshu.io/upload_images/1684666-cf5f0aa5bae7f0bb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>这并不是我想要的结果, 分析原因: 因为代码中的请求都是异步执行, 所以不会等待每个网络请求结束后才代表该线程执行完毕, 所以执行顺序并不是我想要的. 正确的写法如下:
let group = DispatchGroup()
let queue = DispatchQueue.global()
//banner数据
group.enter()
queue.async(group: group) {
NetworkUtil.shared.getForJSON(url: allBannerUrl, paramters: nil, finished: { (json, error) in
kLog("1")
group.leave()
})
}
//所有人
group.enter()
queue.async(group: group) {
NetworkUtil.shared.getForJSON(url: allQuestionUrl, paramters: nil, finished: { (json, error) in
kLog("2")
group.leave()
})
}
//热门作家
group.enter()
queue.async(group: group) {
NetworkUtil.shared.getForJSON(url: hotAuthorUrl, paramters: nil, finished: { (json, error) in
kLog("3")
group.leave()
})
}
//专题
group.enter()
queue.async(group: group) {
NetworkUtil.shared.getForJSON(url: allTopicUrl, paramters: nil, finished: { (json, error) in
kLog("4")
group.leave()
})
}
group.notify(queue: DispatchQueue.main) {
kLog("完成")
}
输出结果如图:
![输出结果](http://upload-images.jianshu.io/upload_images/1684666-e5b36c273ce68cc7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
下一篇: php查询mysql数据表记录实现代码