我正在尝试从我的 firestore 数据库加载数据,以便当我的 TableView Controller 加载时,它将显示当前存储在数据库中的数据。 为此,我调用 ViewDidLoad() 中的一个函数来填充从数据库检索到的值数组。但是,当我运行代码时,我的 cellForRowAt TableView 函数中出现索引越界错误。我假设设置 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
。就您而言,您根本不需要它。
并直接在闭包内重新加载表格 View 。
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()
}
}
}
}
如果您仍然遇到越界异常,则说明您的 TableView 数据源方法有问题
关于ios - 在 xcode/swift 中运行 UITableView 函数之前,如何从 firebase 加载所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59324842/