美文网首页
Swift GCD任务组

Swift GCD任务组

作者: 嘿_小小小 | 来源:发表于2018-05-25 14:23 被阅读31次

    GCD的任务组在开发中是经常被使用到,当需要一组任务结束后再执行一些操作时,就可以用它啦。

    DispatchGroup的职责就是当队列中的所有任务都执行完毕后,会发出一个通知来告诉告诉大家,任务组中所执行的队列中的任务执行完毕了。

    既然是组,里面就肯定有很多队列,不然怎么能叫做“组”。

    队列和组关联有两种方式:手动、自动。

    1. 自动关联
    func useGroupQueue() {
        let group = DispatchGroup()
        //模拟循环建立几个全局队列
        for index in 0...3 {
    
    //创建队列的同时,加入到任务组中        
    DispatchQueue.global().async(group: group, execute: DispatchWorkItem.init(block: {
                Thread.sleep(forTimeInterval: TimeInterval(arc4random_uniform(2) + 1))
                print("任务\(index)执行完毕")
            }))
        }
        
        //组中所有任务都执行完了会发送通知
        group.notify(queue: DispatchQueue.main) {
            print("任务组的任务都已经执行完毕啦!")
        }
        
        
        print("打印测试一下")
    }
    
    
    

    打印结果:


    image.png
    1. 手动关联
      enter(),leave()是一起使用。前者表示进入到任务组。后者表示离开任务组。
    let manualGroup = DispatchGroup()
    //模拟循环建立几个全局队列
    for manualIndex in 0...3 {
        
        //进入队列管理
        manualGroup.enter()
        DispatchQueue.global().async {
            //让线程随机休息几秒钟
            Thread.sleep(forTimeInterval: TimeInterval(arc4random_uniform(2) + 1))
            print("-----手动任务\(manualIndex)执行完毕")
            
            //配置完队列之后,离开队列管理
            manualGroup.leave()
        }
    }
    
    //发送通知
    manualGroup.notify(queue: DispatchQueue.main) {
        print("手动任务组的任务都已经执行完毕啦!")
    }
    
    

    打印结果:


    image.png

    利用任务组可以完成很多场景的工作。例如多任务执行完后,统一刷新UI。把刷新UI的操作放在notify里面就好了。

    相关文章

      网友评论

          本文标题:Swift GCD任务组

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