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

时间:2018-09-07 05:31:19

标签: ios swift multithreading grand-central-dispatch dispatch-queue

通常,我可以使用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函数将完全完成调度队列中的所有任务?

1 个答案:

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