根据我在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
}
}
}
答案 0 :(得分:1)
首先:我认为主要问题是因为永远不会执行self.isDone = true
。我认为这是因为当您致电fetchData
时,nrTotalProduse
始终为0
,因此执行流程将永远不会进入while循环。
第二:你看到原型中的单元格,因为numberOfRowsInSection
被调用并返回一个你设置为nrTotalProduse
的数字,但因为isDone
变量从未设置过到true
,单元格没有设置相应的值。
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()
}
}
}