Данные загружаются из Firestore (и большинства современных веб- и облачных API) асинхронно. К моменту запуска return mediaDict
, mediaDict[media] = (dataDescription![media]! as! String
еще не был вызван, поэтому вы не видите его содержимого.
Любой код, которому нужны данные из базы данных, нуждается в быть внутри замыкания / обратного вызова или быть вызванным оттуда. Например:
docRef.getDocument { (document, error) in
var mediaDict: [String: String] = [:]
mediaDict["UID"] = Auth.auth().currentUser?.uid
if let document = document, document.exists {
let dataDescription = document.data()
for media in selected {
print(media, ":", dataDescription![media]!)
mediaDict[media] = (dataDescription![media]! as! String)
}
} else {
print("Document does not exist")
self.dismiss(animated: true, completion: nil)
}
print("Dictionary: ", mediaDict)
}
Вы заметите, что здесь нет оператора return
, поскольку вы не можете вернуть то, что еще не загружено.
альтернативой наличию кода внутри замыкания / обратного вызова является передача собственного обработчика завершения в getMediaInfo
и вызов его после загрузки данных (где у нас теперь print("Dictionary: ", mediaDict)
).
Это выглядело бы примерно так:
func getMediaInfo(selected: [String], completionHandler: (Dictionary<String, String>) -> ()) {
let db = Firestore.firestore()
let docRef = db.collection("users").document(Auth.auth().currentUser!.uid)
docRef.getDocument { (document, error) in
var mediaDict: [String: String] = [:]
mediaDict["UID"] = Auth.auth().currentUser?.uid
if let document = document, document.exists {
let dataDescription = document.data()
for media in selected {
print(media, ":", dataDescription![media]!)
mediaDict[media] = (dataDescription![media]! as! String)
}
} else {
print("Document does not exist")
self.dismiss(animated: true, completion: nil)
}
completionHandler(mediaDict)
}
}
getMediaInfo(["one", "two"]) { info in
print(info)
}
Вы заметите, что это очень похоже на то, что используют сами API-интерфейсы Firestore, вы просто возвращаете более специфичную для приложения версию c data.
См. также: