Как отследить, когда задачи очереди отправки в рекурсии все выполнены?
Обычно я могу использовать DispatchGroup
отслеживать задачи в нескольких диспетчерских задач. Но для того, чтобы убедиться, DispatchGroup
работает правильно, group.notify
метод должен быть вызван после всех group.enter
призваны для всех task
s.
Вопрос на данный момент: у меня рекурсия, и в рекурсии это создает больше task
s, я хочу убедиться, что все 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")
}
}