Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用Swift使数据源与firebase实时数据库保持同步?_Ios_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Ios 如何使用Swift使数据源与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

我正在使用Firebase实时数据库。数据结构是一个帖子数组,用户也可以对其进行评论

我像这样检索数据并将它们放入本地
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)您不必编写特定的代码来处理此问题。