首页 > 解决方案 > 将 Firestore 数据加载到表视图 Swift 4

问题描述

我有一个与将数据从 Firestore 加载到表视图有关的问题。基本上,我知道该怎么做,但是在这种情况下,如果 Firestore 的结构如下所示,我会感到困惑:

“基金”->“randomId”->“agensi:id”

基金

我能够从“WJ18kBvDLhVrvml2slXB”集合中加载agensi。要获得真正的 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)

但它什么也没显示。所以,我无法将代理机构的名称加载到我的表格视图单元格中。顺便说一句对不起我的英语不好。提前致谢

标签: arraysswiftgoogle-cloud-firestore

解决方案


有几件事我想说:

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在 a中使用 a时loop不要使用return,因为如果发生任何错误,它将中断循环以进行下一次迭代。我们应该continue在这里使用来让循环完全执行。


推荐阅读