我正在成功检索 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
每当数据库中的值发生变化时,方法就会触发。
另外,删除 handle
是 viewDidDisappear
.
如果您想手动读取一次数据,请使用 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/