Ios 如何使用Swift使数据源与firebase实时数据库保持同步?
我正在使用Firebase实时数据库。数据结构是一个帖子数组,用户也可以对其进行评论 我像这样检索数据并将它们放入本地Ios 如何使用Swift使数据源与firebase实时数据库保持同步?,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我正在使用Firebase实时数据库。数据结构是一个帖子数组,用户也可以对其进行评论 我像这样检索数据并将它们放入本地posts数组: ref.observe(.childAdded, with: { (snapshot) -> Void in self.posts.append(snapshot) self.tableView.reloadData() }) 它们显示正确,到目前为止没有问题。现在让我们假设用户喜欢一篇帖子。我将他的id添加到本地posts数组中的likersp
posts
数组:
ref.observe(.childAdded, with: { (snapshot) -> Void in
self.posts.append(snapshot)
self.tableView.reloadData()
})
它们显示正确,到目前为止没有问题。现在让我们假设用户喜欢一篇帖子。我将他的id添加到本地posts
数组中的likers
post数组中。但是firebase数据库还不知道这一点
我的问题是,保持本地数据和firebase数据同步的正确方法是什么?您应该使用DatabaseHandler。您应该侦听数据库,然后在离开viewcontroller时删除处理程序
fileprivate lazy var ref = Database.database().reference().child("...")
private var yourHandler: DatabaseHandle?
override func viewDidLoad() {
super.viewDidLoad()
yourHandler = ref.observe(.childAdded, with: { (snapshot) -> in
self.posts.append(snapshot)
DispatchQueue.main.async {
self.tableView.reloadData()
}
})
}
deinit {
if let handler = yourHandler {
ref.removeObserver(withHandle: handler)
}
}
现在,当您向数据库添加新项目时,处理程序将获取该项目并将其显示在viewcontroller中。
注意:始终在主线程上调用reloadData()方法Firebase的技巧通常是仅在用户执行某个操作(例如喜欢帖子)时更新数据库。从该数据库更新中,您将获得一个新事件,例如更新like的
.childChanged
。然后根据数据库中的事件更新UI
这有时被称为反应模型,或者更正式地称为:将命令流(从用户到数据库)与查询流(从数据库到视图)分开。我已经可以显示帖子了。我的问题是如何修改它们。谢谢你的回答。这是有道理的,但缺点是更新视图的速度较慢,不是吗。Firebase的数据库在这里做了一个巧妙的小动作:它在将命令发送到服务器之前触发本地
.childChanged
,因此它几乎是即时的。它还处理边缘情况,例如当服务器拒绝写入操作时。但重要的是:1)用户获得了他们期望的行为(快速更新)2)您不必编写特定的代码来处理此问题。