У меня есть функция, которая загружает данные из firebase:
func downloadData(path: String) -> Data? {
let data: Data?
let storage = Storage.storage()
storage.reference(forURL: path).getData(maxSize: 1024 * 1024) { (result, error) in
if let error = error {
print("\(error)")
} else {
data = result
print("finished")
}
return data // <-- this is called before closue ends
}
, но она не возвращает значение из закрытия хранилища. Я попытался использовать группу отправки
func downloadData(path: String) -> Data? {
...
let group = DispatchGroup()
group.enter()
storage.reference(forURL: path).getData(maxSize: 1024 * 1024) { (result, error) in
...
...
group.leave()
}
group.notify(queue: .main) {
return data // <-- build time error! the function doesn't return a value
}
}
, поэтому я попробовал другой подход: вместо group.notify () я использовал:
group.wait()
, но это тоже не сработало. все приложение было заморожено, и ничего не произошло
, и я попробовал другое:
let semaphore = DispatchSemaphore(value: 0)
storage.reference(forURL: path).getData(maxSize: 1024 * 1024) { (result, error) in
...
...
semaphore.signal()
}
semaphore.wait()
return data // <-- nothing happens... it is not being executed
Есть идеи, как это выяснить?
ОБНОВЛЕНИЕ
Я попытался использовать опцию завершения, но он все еще не ждал, пока он не будет загружен.
это моя внешняя функция:
var soundData: Data?
var imageData: Data?
downloadData(path: soundPath) { sound in
soundData = sound
downloadData(path: imageData) { image in
imageData = image
}
}
doMoreStuff() // <-- called before completeion blocks executed