我有一个与从Firestore加载数据到表视图相关的问题。基本上,我理解如何做到这一点,但在这种情况下,如果Firestore的结构如下,我有点混淆:
"基金" - > " randomId" - > " agensi:id"
我能够从收集中加载agensi,这是" WJ18kBvDLhVrvml2slXB"。要获得真正的agensi名称,我必须从集合中获取数据" Agensi"如下图所示:
下面是我已经做过的代码:
var agencyname: [String] = []
func getData() {
db.collection("fund").getDocuments()
{
(querySnapshot, err) in
if let err = err
{
print("Error getting documents: \(err)");
}
else
{
// var agencyNumber = 0
for document in querySnapshot!.documents {
let data = document.data()
let agency = data["agensi"] as? String ?? ""
let agencyId = document.documentID
print(agency)
print(agencyId)
//MARK get name
let newdocRef = Firestore.firestore().document("Agensi/\(agency)")
newdocRef.getDocument { (docSnapshot, error) in
guard let docSnapshot = docSnapshot, docSnapshot.exists else { return }
let dataDetails = docSnapshot.data()
let agencyNew = dataDetails!["name"] as? String ?? ""
self.agencyname.append(agencyNew)
print("List of the agency: \(self.agencyname.append(agencyNew))")
}
}
self.tableView.reloadData()
}
}
}
我尝试打印:
self.agencyname.append(agencyNew)
但它没有显示。所以,我无法将代理商的名称加载到我的表格视图单元格中。顺便说一句,对不起我的英语不好。提前致谢
答案 0 :(得分:0)
我想说几件事:
1。 FireStore
查询是异步的,因此在完成后会有回调函数。在回调中重新加载tableView
而不是循环结束,然后才能正确加载数据。
DispatchQueue.main.async {
self.tableView.reloadData()
}
在print("List of the agency: \(self.agencyname.append(agencyNew))")
行下面写上面的代码。
2。您正在打印"self.agencyname.append(agencyNew)"
,顺便说一下void
,因此不会打印任何内容,而是print(\(self.agencyname))
。
3。在guard
中使用loop
时,请不要使用return
,因为如果发生任何错误,它会破坏下一次迭代的循环。我们应该在这里使用continue
让循环完全执行。