Как отследить, когда задачи очереди отправки в рекурсии все выполнены?

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

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

1 ответ

Решение

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