将Firestore数据加载到表视图Swift 4

时间:2018-04-30 05:45:12

标签: arrays swift google-cloud-firestore

我有一个与从Firestore加载数据到表视图相关的问题。基本上,我理解如何做到这一点,但在这种情况下,如果Firestore的结构如下,我有点混淆:

"基金" - > " randomId" - > " agensi:id"

fund

我能够从收集中加载agensi,这是" WJ18kBvDLhVrvml2slXB"。要获得真正的agensi名称,我必须从集合中获取数据" Agensi"如下图所示:

enter image description here

下面是我已经做过的代码:

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)

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

1 个答案:

答案 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让循环完全执行。