如何使用Swift保持数据源与firebase实时数据库同步?

时间:2017-11-13 11:17:31

标签: ios swift firebase firebase-realtime-database

我正在使用Firebase实时数据库。数据结构是一个帖子数组,用户也可以评论和喜欢。

我检索这样的数据并将它们放入本地posts数组中:

ref.observe(.childAdded, with: { (snapshot) -> Void in
  self.posts.append(snapshot)
  self.tableView.reloadData()
})

它们显示正确,到目前为止没有任何问题。现在让我们说用户喜欢一个帖子。我将他的id添加到本地likers数组中的posts数组中。然而,firebase数据库还不知道这一点。

我的问题是保持本地数据和firebase数据同步的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

Firebase的技巧通常只是在用户执行操作时更新数据库,例如喜欢帖子。从该数据库更新,您将获得一个新事件,例如.childChanged用于更新喜欢的事件。然后,您可以根据数据库中的事件更新UI。

这有时被称为反应模型,或者更正式地称为Command Query Responsibility Segregation:您将命令流(从用户到数据库)与查询流(从数据库到视图)分开。

答案 1 :(得分:0)

您应该使用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()方法