ios - 在 xcode/swift 中运行 UITableView 函数之前,如何从 firebase 加载所有数据

标签 ios swift firebase uitableview google-cloud-firestore

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

相关文章:

android - 编译 'com.firebaseui:firebase-ui:1.0.1' 显示错误

ios - 将对象转换为存储在变量中的类

ios - 处理多个推送通知时出错

ios - Split View Controller : Pass data to DetailVC on first load/show

multithreading - performSelectorOnMainThread 与 performSegue

ios - 具有输入输出的 rxswift viewmodel

javascript - Firestore 执行 get 命令 super 慢

objective-c - iOS 下载安全

objective-c - 如何让我的 Objective C 类方法只对 Swift 类可见

javascript - 如何从 firestore 两个集合中获取数据并将所有数据合并在一起