Код ниже представляет собой грубый набросок задачи.Опрашивается база данных, она возвращает коллекцию результатов, эта коллекция зацикливается при поиске определенного свойства, если это свойство найдено, немедленно запрашивается хранилище файлов, а его асинхронный обработчик завершения возвращает файл в цикле.Поскольку я обрабатываю асинхронные обратные вызовы внутри цикла for-in, я использую DispatchGroup
для управления этим.Эта настройка работает, только если все документы в коллекции имеют свойство someIdentifier
.Если у одного документа в коллекции нет свойства, группа отправки никогда не вызывает notify()
, и мы застряли в подвешенном состоянии.
someDatabaseQuery.retrieveSomeData { (data, error) in
guard let data = data, error == nil else {
return
}
// database has retrieved data, create dispatch group
let dispatchGroup = DispatchGroup()
for document in data { // loop through collection
// check if document has some identifier
guard let someIdentifier = document["someIdentifier"] as? String else {
return
}
dispatchGroup.enter() // identifier found, enter dispatch
// perform async operation inside loop
Filestorage.getSomeFile(forURL: someIdentifier) { (data, error) in
guard let file = data, error == nil else {
return
}
// download the file
dispatchGroup.leave() // leave dispatch
}
}
dispatchGroup.notify(queue: .main) {
// all data grabbed, load table
}
}