我正在尝试从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/

10-12 00:31
查看更多