【发布时间】:2017-02-24 04:54:42
【问题描述】:
我正在从我的 NoSQL Firebase 数据库中读取数据,将这些数据解析为单个组件,然后将它们显示在我的 tableView 中。我添加了表格刷新功能,因此当添加新数据时,用户可以刷新并将其添加到表格中。
调用刷新表的函数与填充初始表的函数相同,因此从某种意义上说,刷新只是重新启动视图。采取的步骤是:
- 清空包含已解析数据元素的数组和字典
- 从数据库中获取数据
- 解析该数据
- 重新加载表格
这是完整的功能:
func readEventsFromDb() {
// 1. Empty out data structures
eventsForDate.removeAll()
allDates.removeAll()
// 2. Fetch data
let dbRef = FIRDatabase.database().reference().child("pets").child(currentPet).child("events")
dbRef.observeSingleEvent(of: .value, with: { snapshot in
if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {
// 3. Parse data elements
for child in snapshots{
if let data = child.value as? [String: Any] {
if let c = data["comment"] as? String, let p = data["user"] as? String, let t = data["type"] as? Int, let d = data["date"] as? UInt64 {
let event = PetEvent(comment: c, person: p, type: t, time: self.timeFromEpoch(time: Double(d)))
let eventDate = self.dateFromEpoch(time: Double(d))
if (self.eventsForDate[eventDate] != nil) {
self.eventsForDate[eventDate]!.append(event)
} else {
self.eventsForDate[eventDate] = [event]
}
}
}
}
// 4. Refresh table
self.allDates = Array(self.eventsForDate.keys)
self.feedTable.reloadData()
self.refreshControl.endRefreshing()
}
})
}
刷新表几乎只是重新启动视图对我来说没有多大意义,因为这是视图中唯一的东西。这是表格刷新通常的工作方式还是有更有效的方法来做这样的事情?
【问题讨论】:
-
您特别关注流程的哪一部分?
reloadData不会重新启动视图 - 它会回收现有的 UITableViewCell 对象(假设您的表数据源写入正确)。 -
我主要关心 removeAll(),也许有办法不清空数据结构。再次从数据库中读取每个事件可能并不聪明,也许有一种方法可以获取新事件。最后,我担心重新加载表格,但从你所说的情况来看,这并没有我想象的那么重要。
标签: ios swift uitableview firebase firebase-realtime-database