как отследить, когда задачи очереди отправки в рекурсии все выполнены? - PullRequest
0 голосов
/ 07 сентября 2018

Обычно я могу использовать DispatchGroup для отслеживания задач в нескольких задачах Диспетчеризации. Но чтобы убедиться, что DispatchGroup работает правильно, метод group.notify должен вызываться после того, как все group.enter вызваны для всех task s.

На данный момент у меня есть вопрос: у меня рекурсия, и в рекурсии это создает больше 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 в этом примере будет полностью завершена всеми задач из очереди отправки?

1 Ответ

0 голосов
/ 07 сентября 2018

Закрытие, связанное с 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")
    }
}
...