欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)