【发布时间】:2020-03-28 06:17:57
【问题描述】:
我从 Firestore 捕获数据并分配给数组,其他问题中有人告诉我也许我需要一个完成处理程序,但我不明白如何工作,如果你帮助我编写代码并解释,这将非常有帮助这个概念对我来说。
class PetsTVC: UITableViewController {
var db: Firestore!
let uid = Auth.auth().currentUser?.uid
var petslist = [String]()
var pid = ""
var pets = [paw]()
override func viewDidLoad() {
super.viewDidLoad()
self.loadPets()
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
func loadPets(){
let photo1 = UIImage(named: "Log")
db = Firestore.firestore()
db.collection("users").document(uid!).getDocument { documentSnapshot, error in
guard let document = documentSnapshot else {
return
}
self.petslist = document["petslist"] as? Array ?? [""]
}
for pet in self.petslist {
self.db.collection("pets").document(pet).getDocument { documentSnapshot, error in
guard let document = documentSnapshot else {
return
}
guard let data = document.data() else {
return
}
let pid = data["pid"] as! String? ?? ""
let petName = data["petName"] as! String? ?? ""
let infoPet = paw(id: pid, petName: petName, imagenMascota:photo1)
self.pets.insert(infoPet, at: 0)
}
}
}
}
如果您需要代码中的任何其他内容,请告诉我,因为我也是新来的,我不知道该在问题中提出什么。
【问题讨论】:
-
不,对于这个答案,我问了这个问题。
-
该代码无法运行,您也不需要完成处理程序。这只是众多选择之一。 Firestore 是异步的,并且在 firebase 闭包中返回的数据仅在该闭包中有效,并且需要一些时间才能从 Internet 返回。因此,在您的情况下,
for pet循环将在返回该数据之前执行 WAY。简单的解决方法是将 for 循环移动到self.petslist =之后的右侧,以便循环可以处理闭包内有效的数据。
标签: swift xcode firebase uitableview google-cloud-firestore