通常,我可以使用DispatchGroup
来跟踪多个调度任务中的任务。但是,为了确保DispatchGroup
正常工作,必须在所有group.notify
的所有group.enter
被调用之后调用task
方法。
现在的问题是,我要进行递归,并且在递归中它会创建更多task
,因此我想确保所有tasks
已完成。如前所述,如果DispatchGroup.notify
的调用早于所有group.enter
的调用,它将无法正常工作。在这种递归情况下,您将不知道哪个是最后一个group.enter
调用。
Simplist示例:
func findPath(node: Node) {
if !node.isValid { return }
queue.async { //concurrent queue
findPath(node.north)
}
queue.async {
findPath(node.west)
}
queue.async {
findPath(node.south)
}
queue.async {
findPath(node.east)
}
}
这是最简单的示例,在我的情况下,还有许多异步块,例如图像获取,网络api调用等。我如何确保本示例中的findPath
函数将完全完成调度队列中的所有任务?
答案 0 :(得分:2)
直到最后一个dispatchGroup.leave被调用时,才调用与dispatchGroup.notify关联的闭包,因此您在异步任务中enter
外调用leave
< em>内部
类似的东西:
func findPath(node: Node) {
if !node.isValid { return }
dispatchGroup.enter()
queue.async { //concurrent queue
findPath(node.north)
dispatchGroup.leave()
}
dispatchGroup.enter()
queue.async {
findPath(node.west)
dispatchGroup.leave()
}
dispatchGroup.enter()
queue.async {
findPath(node.south)
dispatchGroup.leave()
}
dispatchGroup.enter()
queue.async {
findPath(node.east)
dispatchGroup.leave()
}
}
func findPaths(startNode: Node) {
findPath(node: startNode)
dispatchGroup.notify {
print("All done")
}
}