swift - 检索所有数据然后过滤到 TableView 中的正确方法是什么?

标签 swift xcode firebase firebase-realtime-database

我正在成功检索 Firebase 数据并将其加载到我的表格 View 中。在初始加载时,我根据日期查询数据,因此它仅加载日期在当前日期之后的数据。我还有一个“过去”按钮,可以以相同的方式查询数据,但仅显示日期早于当前日期的数据。它有效,但是我在每次单击按钮时检索数据,它似乎会降低性能并且有时会崩溃。这是这样做的方法吗?或者我可以通过什么方式加载所有数据和带有按钮的查询/过滤器?

override func viewDidLoad() {
    super.viewDidLoad()
//Retrieving data from Firebase
    refReleases = Database.database().reference().child("releases");
    _ = refReleases.queryOrdered(byChild: "date").queryStarting(atValue: currentDate).observe(.value, with: { (snapshot) in
        if snapshot.childrenCount>0{
            self.releasesData.removeAll()
          for releases in snapshot.children.allObjects as![DataSnapshot]{
                let releaseObject = releases.value as? [String: AnyObject]
                let releaseName = releaseObject?["releaseName"]
                let releaseType = releaseObject?["releaseType"]
                let releasePrice = releaseObject?["releasePrice"]
                let releaseDate = releaseObject?["releaseDate"]
                let releaseImage = releaseObject?["releaseImage"]
                let releasetag = releaseObject?["releasetag"]
                let releaseStyleCode = releaseObject?["releaseStyleCode"]
                let release = ReleaseModel(releasetype: releaseType as! String?, releasename: releaseName as! String?, releaseprice: releasePrice as! String?, releasedate: releaseDate as! String?, releaseimage: releaseImage as! String?, releasetag: releasetag as! String?, releasestylecode: releaseStyleCode as! String?) 
                self.releasesData.insert(release, at: 0)
            }
            self.releasesData.reverse()
            self.tableView.reloadData()
        }

    }
    )}
}

//"Past" button
@IBAction func past(_ sender: UIButton) {
    refReleases = Database.database().reference().child("releases");
    _ = refReleases.queryOrdered(byChild: "date").queryEnding(atValue: currentDate).observe(.value, with: { (snapshot) in
        if snapshot.childrenCount>0{
            self.releasesData.removeAll()
            for releases in snapshot.children.allObjects as![DataSnapshot]{
                let releaseObject = releases.value as? [String: AnyObject]
                let releaseName = releaseObject?["releaseName"]
                let releaseType = releaseObject?["releaseType"]
                let releasePrice = releaseObject?["releasePrice"]
                let releaseDate = releaseObject?["releaseDate"]
                let releaseImage = releaseObject?["releaseImage"]
                let releasetag = releaseObject?["releasetag"]
                let releaseStyleCode = releaseObject?["releaseStyleCode"]
                let release = ReleaseModel(releasetype: releaseType as! String?, releasename: releaseName as! String?, releaseprice: releasePrice as! String?, releasedate: releaseDate as! String?, releaseimage: releaseImage as! String?, releasetag: releasetag as! String?, releasestylecode: releaseStyleCode as! String?)
                self.releasesData.insert(release, at: 0)
            }
            self.tableView.reloadData()
        }

    }
    )}

最佳答案

每次单击“过去”按钮时,您基本上都会添加观察者。 observe每当数据库中的值发生变化时,方法就会触发。 另外,删除 handleviewDidDisappear .

如果您想手动读取一次数据,请使用 observeSingleEvent方法。 它只会触发一次。

另外,看看这个 firebase blog post 。 它显示了监听器的放置位置。

var handle: DatabaseHandle!

override func viewDidLoad() {
    super.viewDidLoad()
    //  Retrieving data from Firebase
    refReleases = Database.database().reference().child("releases")
}

override func viewWillApear(_ animated: Bool) {
    super.viewWillAppear(animated)
    handle = refReleases
        .queryOrdered(byChild: "date")
        .queryStarting(atValue: currentDate)
        .observe(.value) { snapshot in
            if snapshot.childrenCount > 0 {
                self.releasesData.removeAll()

                for releases in snapshot.children.allObjects as! [DataSnapshot] {
                    let releaseObject = releases.value as? [String: AnyObject]
                    let releaseName = releaseObject?["releaseName"]
                    let releaseType = releaseObject?["releaseType"]
                    let releasePrice = releaseObject?["releasePrice"]
                    let releaseDate = releaseObject?["releaseDate"]
                    let releaseImage = releaseObject?["releaseImage"]
                    let releasetag = releaseObject?["releasetag"]
                    let releaseStyleCode = releaseObject?["releaseStyleCode"]

                    let release = ReleaseModel(
                        releasetype: releaseType as! String?,
                        releasename: releaseName as! String?,
                        releaseprice: releasePrice as! String?,
                        releasedate: releaseDate as! String?,
                        releaseimage: releaseImage as! String?,
                        releasetag: releasetag as! String?,
                        releasestylecode: releaseStyleCode as! String?) 
                    self.releasesData.insert(release, at: 0)
                }
                self.releasesData.reverse()
                self.tableView.reloadData()
            }
        }
    }
}

override func viewDidDisappear(_ animated: Bool) {
    if let handle = handle {
        refReleases.removeObserver(withHandle: handle)
    }
}

关于swift - 检索所有数据然后过滤到 TableView 中的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57157123/

相关文章:

swift - 类型安全和类型推断有什么区别?

swift - Swift-SKLabelNode无法正常工作

xcode - 如何在 xcode 中将远程脚本作为构建阶段执行?

ios - 我如何在 xcode 构建阶段获取方案名称(shell 脚本)

ios - Firebase queryEquals 不返回 Swift 中的值

javascript - 在一定距离内从 firebase 获取数据

firebase - 我的 Firebase 项目中不再需要默认网站

ios - 使用 Xcode/Swift 或 unicorn pixie dust 在 iPad 上覆盖(阻止)或关闭 iOS

ios - 如何检查 AnyObject 单元格的类型?

ios - 静默推送通知在 iOS 14 上无法正常工作