Firebase / Firestore - 完成块未按预期工作

时间:2018-06-14 09:17:31

标签: swift firebase google-cloud-firestore

根据我在Firestore文档页面上阅读的内容,在获取文档后,应该调用完成处理程序(也称为闭包)。我有以下代码,我试图从Firestore的集合中显示每个文档的字段,但是当我运行应用程序时,它不起作用。每个单元格的标签都没有改变。

稍后编辑:此外,滚动浏览桌面视图确实是错误的,当您向下滚动并尝试再次向上滚动时,它不会上升,它只会摇晃。

import UIKit
import Firebase
import FirebaseFirestore

class AnunturiViewController: UITableViewController {

    var anunturi: [Produs] = [Produs]()
    var docRef: DocumentReference!
    var docRefNrTotalProduse: DocumentReference!
    var nrTotalProduse = 0
    var isDone = false

    override func viewDidLoad() {
        super.viewDidLoad()
        fetchData()
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ADCell") as! ADTableViewCell
        if isDone == true {
            cell.denumireAnuntLabel.text = anunturi[nrTotalProduse - indexPath.row].denumire
        }
        return cell
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        docRefNrTotalProduse = Firestore.firestore().collection("nrproduse").document("nrproduse")

        docRefNrTotalProduse.getDocument { (snapshot, error) in
            if error != nil { print(error ?? "0") }
            else {
                let data = snapshot?.data()
                self.nrTotalProduse = data!["nrtotalproduse"] as! Int
                tableView.reloadData()
            }
        }

        return nrTotalProduse
    }

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 164.0
    }

    @IBAction func onRefreshButtonPressed(_ sender: UIBarButtonItem) {
        tableView.reloadData()
    }

    func fetchData() {
        var i = 0
        while(i < nrTotalProduse) {
            docRef = Firestore.firestore().collection("produse").document(String(nrTotalProduse - i))

            docRef.getDocument { (snapshot, error) in
                let data = snapshot?.data()
                let produs = Produs(denumire: (data?["nume"] as? String)!)
                self.anunturi.append(produs)
                DispatchQueue.main.async {
                    if i == self.nrTotalProduse - 1 {
                        self.isDone = true
                        self.tableView.reloadData()
                    }
                }
            }

            i += 1
        }
    }

}

1 个答案:

答案 0 :(得分:1)

首先:我认为主要问题是因为永远不会执行self.isDone = true。我认为这是因为当您致电fetchData时,nrTotalProduse始终为0,因此执行流程将永远不会进入while循环。

第二:你看到原型中的单元格,因为numberOfRowsInSection被调用并返回一个你设置为nrTotalProduse的数字,但因为isDone变量从未设置过到true,单元格没有设置相应的值。

第三:&#34;越野车&#34;滚动你的体验是因为你在numberOfRowsInSection方法中调用的是什么。每当你调用tableView.reloadData时都会调用此方法,所以你正在做的是保持一个永远不会在这个方法中结束的调用循环,导致调用reloadData这么多次你甚至可以调用看滚动。

完全避免在numberOfRowsInSection方法中进行此类调用。

修改

如果您要执行的操作是获取produse集合中的所有文档,我强烈建议您将fetchData方法更改为以下内容:

func fetchData() {
    docRef = Firestore.firestore().collection("produse")
    docRef.getDocuments() { (querySnapshot, error) in
        if let error = error {
            print("Error getting documents: \(error)")
        } else {
            for document in querySnapshot!.documents {
                let data = document.data()
                let produs = Produs(denumire: (data?["nume"] as? String)!)
                self.anunturi.append(produs)
            }

            self.isDone = true
            self.tableView.reloadData()
        }
    }
}