Как использовать 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)
        }
    }
Другие вопросы по тегам