如何监控递归调度队列的任务何时全部完成?

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")
    }
}