有效刷新TableView?

时间:2017-02-24 04:54:43

标签: ios swift uitableview firebase firebase-realtime-database

我正在从NoSQL Firebase数据库中读取数据,将数据解析为单个组件,然后在我的tableView中显示它们。我添加了表刷新功能,因此当添加新数据时,用户可以刷新并将其添加到表中。

刷新表的函数与初始表填充的函数相同,所以在某种意义上刷新只是重新启动视图。采取的步骤是:

  1. 清空包含已解析数据元素的数组和字典
  2. 从数据库中获取数据
  3. 解析该数据
  4. 重新加载表格
  5. 这是完整的功能:

    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()
            }
    
        })
    }
    

    对我而言,刷新表几乎只是重新启动视图并不是很有意义,因为这是视图中唯一的东西。这是表刷新通常如何工作或是否有更有效的方法来做这样的事情?

1 个答案:

答案 0 :(得分:2)

使用ref.observe代替ref.observeSingleEvent来持续更新表格视图。

ref.observe(.childAdded ...) //insert row
ref.observe(.childRemoved ...) //remove row
ref.observe(.childChanged ...) //update row