Как использовать DispatchGroup для выполнения асинхронных вызовов в цикле for
В моем примере кода ниже я звоню complete(false)
на провал. Тем не менее, так как я использую DispatchGroup
объект, чтобы убедиться, что все асинхронные запросы завершены, я не могу просто позвонить syncGroup.leave()
на неудачу, как notify
будет называться, который содержит complete(true)
, возвращая эту функцию true
когда оно должно возвращаться false
за неудачу.
Правильно ли я не звоню syncGroup.leave()
в случае невозможности выполнить мою функцию правильно? Или я должен звонить syncGroup.leave()
и как-то пытается определить, каков результат, чтобы я мог вернуться false
на провал?
let syncGroup = DispatchGroup()
syncGroup.enter()
for track in unsynced {
register(time: time, withCompletion: { (success: Bool) -> () in
if success {
self.debug.log(tag: "SyncController", content: "Registered")
syncGroup.leave()
}
else {
complete(false)
}
})
}
//all requests complete
syncGroup.notify(queue: .main) {
self.debug.log(tag: "SyncController", content: "Finished registering")
complete(true)
}
1 ответ
Решение
Вы должны войти в группу внутри вашего цикла for. Возможно, вы захотите ввести дополнительный флаг ошибки.
Пример реализации:
var fail = false
let syncGroup = DispatchGroup()
for track in unsynced {
syncGroup.enter()
register(time: time, withCompletion: { (success: Bool) -> () in
if success {
self.debug.log(tag: "SyncController", content: "Registered")
syncGroup.leave()
}
else {
fail = true
syncGroup.leave()
}
})
}
//all requests complete
syncGroup.notify(queue: .main) {
if fail {
complete(false)
} else {
self.debug.log(tag: "SyncController", content: "Finished registering")
complete(true)
}
}