DispatchGroup无法按预期工作

瑞安

我做了一个DispatchGroup并运行2个异步任务。一个打开main,另一个打开global()

据我了解,DispatchGroup.notify一旦完成所有任务,就应该调用块,但它不会像我想的那样工作。

class Que {
    let group = DispatchGroup()

    init() {
        group.notify(queue: .main) {
        print("group done")
        }
    }

    func run() {
        doC()
        doD()
    }

    fileprivate func doC() {
        group.enter()
        DispatchQueue.main.async(group: group) {
            var rst = 0
            for idx in 0 ..< 500 {
                rst += idx
            }
            print("work item c is done")
            self.group.leave()
        }
    }

    fileprivate func doD() {
        group.enter()
        DispatchQueue.global().async(group: group) {
            var rst = 0
            for idx in 0 ..< 50 {
                rst += idx
            }
            print("work item d is done")
            self.group.leave()
        }
    }
}

结果是

work item d is done
group done
work item c is done

我想知道为什么不是

work item d is done
work item c is done
group done

如果我做了CD任务运行global()队列,它的工作。

rmaddy

您将呼叫打到notify错误的地方,并且打得太早了。

您很可能希望notifyrun方法末尾调用

init() {
}

func run() {
    doC()
    doD()

    group.notify(queue: .main) {
        print("group done")
    }
}

请注意该notify方法的文档中所说的内容

安排一组先前提交的块对象完成后将要提交给队列的工作项目

大胆是我的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章