寻找更好的方法来区分2个数组

时间:2016-10-19 04:12:42

标签: swift firebase firebase-realtime-database

我有一个要在表格中显示的对象列表。我使用Firebase,这使我可以监控特定的数据列表,并在列表更改时收到通知。

我有一个PersonViewController类,其UITableView并且具有people属性,用于容纳我想要显示的对象列表:

var people: [Person] = []

我通过Firebase电话更新此媒体资源:

personRef.observe(.value, with: { [unowned self] snapshot in
  let personDict = snapshot.value as! [String: [String: Any]]
  self.people = personDict.map { Person(dictionary: $0.1) }
  self.tableView.reloadData()
})

只要列表发生更改,就会更新我的people数组。

目前,我通过调用tableView.reloadData()来更新tableView。我只想重新加载改变的东西:

tableView.beginUpdates()
tableView.reloadRows(at: /* the indexes of the changed elements */, with: .automatic)
tableView.endUpdates()

FirebaseFoundation中有一个方便的方法/流程可以返回一个已更改的索引列表吗?或者我需要手动计算吗?

1 个答案:

答案 0 :(得分:1)

如果您想更细粒度地更新客户端结构或UI,您应该订阅子事件。

来自Firebase documentation

// Listen for new comments in the Firebase database
commentsRef.observe(.childAdded, with: { (snapshot) -> Void in
  self.comments.append(snapshot)
  self.tableView.insertRows(at: [IndexPath(row: self.comments.count-1, section: self.kSectionComments)], with: UITableViewRowAnimation.automatic)
})
// Listen for deleted comments in the Firebase database
commentsRef.observe(.childRemoved, with: { (snapshot) -> Void in
  let index = self.indexOfMessage(snapshot)
  self.comments.remove(at: index)
  self.tableView.deleteRows(at: [IndexPath(row: index, section: self.kSectionComments)], with: UITableViewRowAnimation.automatic)
})

此代码段会侦听添加或删除子项的时间,然后更新本地comments数组和表视图以进行更改。