我做了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
队列上运行了D
和global()
任务,那就可以了。
答案 0 :(得分:3)
你把notify
的电话放在错误的地方并且过早地调用它。
您最有可能希望在notify
方法结束时致电run
。
init() {
}
func run() {
doC()
doD()
group.notify(queue: .main) {
print("group done")
}
}
请注意notify
方法的文档中所说的内容:
当一组以前提交的块对象完成后,计划要提交到队列的工作项。
大胆是我的。