美文网首页
DispatchGroup踩过的坑

DispatchGroup踩过的坑

作者: sun5kong | 来源:发表于2017-08-16 11:16 被阅读208次

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("完成")
        }       


输出结果如图:

![输出结果](https://img.haomeiwen.com/i1684666/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("完成")
    }
输出结果如图:
![输出结果](https://img.haomeiwen.com/i1684666/e5b36c273ce68cc7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

相关文章

  • DispatchGroup踩过的坑

    DispatchGroup踩过的坑 需求: 一个页面有四个网络请求, 四个网络请求结束后进行界面刷新. 我们首先想...

  • 交互设计师所要避免的几个坑

    前言 工作中难免会踩到几个坑,即使现在不踩以后还会踩,只有踩过才会深刻记住,踩过说明爱过!但是踩过的坑必须把坑填满...

  • vue踩过的坑

    vue踩过的坑

  • D1094:踩坑的价值最大化

    是人就会踩坑,不踩坑理论上就不属于人类,踩坑是人之常情,能回头站在坑边反思,才是对踩过的的坑价值最大化的体现,要不...

  • 投资避坑指南

    2022年9月14日(第224天) 经常反思踩过的坑,犯过的错,了解别人踩过的坑,犯过的错,思考如何避免自己下次踩...

  • PHP中的数据类型

    一说到数据类型,这个坑就太多了,多到有哪些坑,有多少坑,不知道自己还会踩哪些坑,以及踩过的坑还会不会再踩,我对...

  • 踩过的坑

    1、关于Windows下修改hosts文件无法生效,刚开始直接用浏览器打开发现404,后来ping域名才发现是连接...

  • 踩过的坑

    问题: 虚拟机中一打开metasploit就死机。 答: 发现虚拟机分配内存512M。分配2G后,正常。 问题: ...

  • 踩过的坑

    虚拟机/远程桌面实验室1&7:VNC远程桌面实验室2~6:VM虚拟机 VM虚拟机连接成功后不显示虚拟机资源库方法:...

  • 踩过的坑

    tomcat部署问题 问题概述:1. tomcat部署需要重启两次2. 定时任务要跑两次3. 配置的docbase...

网友评论

      本文标题:DispatchGroup踩过的坑

      本文链接:https://www.haomeiwen.com/subject/agfirxtx.html