DispatchGroup没有按预期工作

时间:2017-08-14 18:35:44

标签: ios swift grand-central-dispatch

我做了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

如果我在C队列上运行了Dglobal()任务,那就可以了。

1 个答案:

答案 0 :(得分:3)

你把notify的电话放在错误的地方并且过早地调用它。

您最有可能希望在notify方法结束时致电run

init() {
}

func run() {
    doC()
    doD()

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

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

  

当一组以前提交的块对象完成后,计划要提交到队列的工作项。

大胆是我的。