我正在尝试从Firestore数据库中加载数据,以便在加载Table View Controller时,它将显示当前存储在数据库中的数据。
为此,我在ViewDidLoad()中调用一个函数,该函数填充从数据库检索的值的数组。但是,当我运行代码时,我的cellForRowAt表View函数中出现索引超出范围错误。我假设在填充实际数组之前运行用于设置视图的代码。因此,数组中没有用于设置表的值。正在访问数据,因为我能够将数据打印到控制台。另外,当我打印出我的array.count时,它返回0。所以我知道数据没有被放入数组中。
我已经在寻找解决方案,但没有一个对我有用。我找到了建议使用GroupDispatch异步函数的解决方案,让它等待数据的检索。这些似乎都不适合我。这是我正在尝试的代码。
var didfinishloading = false{
didSet{
self.tableView.reloadData()
}
}
override func viewDidLoad() {
super.viewDidLoad()
initialGet()
//populateDatabase()
}
func initialGet(){
let dispatchGroup = DispatchGroup()
dispatchGroup.enter()
db.collection("PlayerStats").getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
let stats = PlayerStats(name:document.data()["name"] as! String, points: document.data()["points"] as! Int, assists: document.data()["assists"] as! Int, rebounds: document.data()["rebounds"] as! Int, image: document.data()["image"] as! String)
self.playerArray.append(stats)
dispatchGroup.leave()
}
dispatchGroup.notify(queue: .main){
self.didfinishloading = true
}
}
}
}
我使用didFinishLoading变量来告知何时已检索所有数据,然后我希望它在设置为true时重新加载数据。
如果有人可以提供帮助,或为此指出正确的方向?
最佳答案
您正在滥用DispatchGroup
。在您的情况下,您根本不需要它。
并直接在闭包内部重新加载表视图。
func initialGet(){
db.collection("PlayerStats").getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
let data = document.data()
let stats = PlayerStats(name:data["name"] as! String,
points: data["points"] as! Int,
assists: data["assists"] as! Int,
rebounds: data["rebounds"] as! Int,
image: data["image"] as! String)
self.playerArray.append(stats)
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
}
如果仍然遇到越界异常,则表视图数据源方法有问题
关于ios - 在Xcode/Swift中运行UITableView函数之前,如何从Firebase加载所有数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59324842/