我正在使用Firebase实时数据库。数据结构是一个帖子数组,用户也可以评论和喜欢。
我检索这样的数据并将它们放入本地posts
数组中:
ref.observe(.childAdded, with: { (snapshot) -> Void in
self.posts.append(snapshot)
self.tableView.reloadData()
})
它们显示正确,到目前为止没有任何问题。现在让我们说用户喜欢一个帖子。我将他的id添加到本地likers
数组中的posts
数组中。然而,firebase数据库还不知道这一点。
我的问题是保持本地数据和firebase数据同步的正确方法是什么?
答案 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()方法