DispatchGroup无法按预期方式工作
问题描述:
我制作了DispatchGroup
并运行了2个异步任务。一个在main
上,另一个在global()
上。DispatchGroup无法按预期方式工作
只要我明白,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
如果我做了global()
队列C
和D
任务运行,它的工作。
答
你把电话打到notify
错误的地方,现在称它太早了。
很可能你想在run
方法的结尾呼叫notify
。
init() {
}
func run() {
doC()
doD()
group.notify(queue: .main) {
print("group done")
}
}
注意什么说的notify
方法的文档中:
调度工作项时,一组以前提交块的对象已经完成提交到队列。
大胆的是我的。
所以它不像平常的回调关闭。我想如果我设置了一次,每次在组中完成时都会调用它。谢谢! – Ryan
当队列中没有当前任务时(在最后一次对任何当前输入的任务进行“离开”调用之后)它会被调用。 – rmaddy