如何监控递归调度队列的任务何时全部完成?
how to monitor when tasks of dispatch queue in recursion all completed?
通常我可以使用DispatchGroup
来跟踪多个Dispatch 任务中的任务。但是为了确保 DispatchGroup
正常工作,必须在为所有 task
调用所有 group.enter
之后调用 group.notify
方法。
现在的问题是,我正在进行递归,在递归中它创建了更多 task
,我想确保所有 tasks
都已完成。正如我之前提到的,如果 DispatchGroup.notify
比所有 group.enter
调用得早,它就不会正常工作。在这种递归情况下,您不知道最后一次 group.enter
调用是什么时候。
简单示例:
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
函数在这个例子会被调度队列中的所有任务完全完成吗?
与 dispatchGroup.notify 关联的闭包在调用最后一个 dispatchGroup.leave 之前不会被调用,因此您在 enter
外部 调用异步任务和leave
里面
类似于:
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")
}
}
通常我可以使用DispatchGroup
来跟踪多个Dispatch 任务中的任务。但是为了确保 DispatchGroup
正常工作,必须在为所有 task
调用所有 group.enter
之后调用 group.notify
方法。
现在的问题是,我正在进行递归,在递归中它创建了更多 task
,我想确保所有 tasks
都已完成。正如我之前提到的,如果 DispatchGroup.notify
比所有 group.enter
调用得早,它就不会正常工作。在这种递归情况下,您不知道最后一次 group.enter
调用是什么时候。
简单示例:
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
函数在这个例子会被调度队列中的所有任务完全完成吗?
与 dispatchGroup.notify 关联的闭包在调用最后一个 dispatchGroup.leave 之前不会被调用,因此您在 enter
外部 调用异步任务和leave
里面
类似于:
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")
}
}