swift - 将大数据从 firestore 加载到 TableView Swift

标签 swift uitableview firebase google-cloud-firestore

firestore 存储大约 500 多条信息,我想将其显示到 TableView 中。基本上,我已经成功显示了我单元格中的所有数据,但问题是,加载所有数据需要 1 分钟多的时间。加载数据时,我无法滚动 TableView ,除非所有数据都完成加载。如何在数据仍在加载时启用滚动?如果不可能,如何先加载前 20 个数据,如果用户在单元格末尾,将继续加载?这是我尝试过的一些代码 从 Firestore 获取数据:

    func getData () {
    db.collection("fund").getDocuments()
        {
            (querySnapshot, err) in

            if let err = err
            {
                print("Error getting documents: \(err)");
            }
            else
            {
                for document in querySnapshot!.documents {
                    let data = document.data()
                    let agencyPath = data["agensi"] as? String ?? ""
                    let title = data["title"] as? String ?? ""
                    let program = data["program"] as? String ?? ""
                    let perniagaan = data["perniagaan"] as? String ?? ""
                    let newMax = data["max"] as? Int
                    let agencyId = document.documentID
                    let query = Firestore.firestore().collection("Agensi")
                    let newQuery = query.whereField("name", isEqualTo: "\(agencyPath)")

                    newQuery.getDocuments()
                        {
                            (querySnapshot, err) in

                            if let err = err {
                                print("Error getting documents: \(err)");
                            } else
                            {
                                for document in querySnapshot!.documents {
                                    let data = document.data()
                                    let logo = data["logo"] as? String ?? ""
                                    //store to Struct
                                    let newModel = DisplayModel(agency: title, agencyId: agencyId, programTag: program, perniagaanTag: perniagaan, max: newMax, agencyPath: agencyPath, logoUrl: logo, agencyTitle: agencyPath)
                                    self.agencyList.append(newModel)
                                }
                                self.tableView.reloadData()
                                self.dismiss(animated: false, completion: nil)
                            }
                    }
                }

            }
    }
}

在单元格上显示数据:

      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cellData: DisplayModel

    if searchController.searchBar.text != "" {
        cellData = filteredData[indexPath.row]

    } else {
        cellData = agencyList[indexPath.row]

    }

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? HomeTableViewCell

    cell?.agencyName.text = cellData.agency
    cell?.agencyImage.sd_setImage(with: URL(string: "\(cellData.logoUrl ?? "")"), placeholderImage: UIImage(named: "no_pic_image"))

    return cell!


}

对最后一行单元格的操作:

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    if searchController.searchBar.text != "" {
       let lastElement = filteredData.count - 1
        if indexPath.row == lastElement {
            //getData()
            // handle your logic here to get more items, add it to dataSource and reload tableview
        }
    } else {
        let lastElement = agencyList.count - 1
        if indexPath.row == lastElement {
            //getData()
            // handle your logic here to get more items, add it to dataSource and reload tableview
        }

    } 
}

我真的不知道我应该用什么方法先加载20个数据并在单元格行的末尾继续加载,如果没有解决方案,至少我可以在加载 session 期间滚动 TableView 。谢谢你的信息,我上个月才学swift。谢谢你帮助我。

最佳答案

您应该明确采用UITableViewDataSourcePrefetching 协议(protocol)。

查看一些博客,例如: https://www.raywenderlich.com/187041/uitableview-infinite-scrolling-tutorial

并将其用于分页,如下所述: https://firebase.google.com/docs/firestore/query-data/query-cursors

关于swift - 将大数据从 firestore 加载到 TableView Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51190481/

相关文章:

iphone - 如何在复杂的导航堆栈之间传递变量

firebase - 我在独立应用程序 expo-deeplink 上测试后,调度功能似乎运行了不止一次

Android 应用程序在关闭时未收到 FCM 通知

java - 如何通过传递查询来删除 Firestore 文档?

cocoa - 使用 SpriteKit 高效渲染平铺 map

ios - 如何向 google Direction api 发送请求以快速获取路径

ios - 长按手势识别器干扰 UITableView 中的滚动

swift - UIApplication.sharedApplication().delegate as! AppDelegate EXC_BREAKPOINT

ios - 使用 UIGraphicsImageRenderer 的 UIView 到 UIImage 错误地使用 alpha 渲染图像

uitableview - 如何在UITableView中选择多行