我遇到了一个问题,确保在使用持久性时数据与数据库同步。在你逃跑之前,我只是对一个特定的行为有疑问,我想知道我做错了什么或者这是否是预期的行为。
以下是我使用的基本设置:
ref.observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in
// Gets cached or live data
// Does all the things
ref.observe(.childAdded) { (snapshot: FIRDataSnapshot) in
// Gets new children added
// Adds the things
}
ref.observe(.childRemoved) { (snapshot: FIRDataSnapshot) in
// Gets removed children
// Removes the things
}
}
这在大多数用例中都很有用。当在显示数据的屏幕上,在这种情况下,评论提要,数据被完美地添加和删除。
更重要的是,当回到之前访问过的评论供稿时,将加载缓存,然后为每个未包含在缓存中的新评论触发.childAdded。那很棒。
我遇到的问题是回到之前访问过的评论Feed,其中评论已被删除。不会为每个已删除的评论调用 .childRemoved。哪个会在屏幕上留下过时的数据。考虑到数据已被删除,因此无法发送快照,我可以看到这可能是预期的行为。
如果是这种情况,那么确保用户未被提交已删除的评论的正确做法是什么?
如果需要澄清,请告诉我!谢谢。
答案 0 :(得分:0)
我认为这里发生的是由持久性行为引起的微妙种族。
当您调用observe时,您将设置一个侦听器,该侦听器将在发生更改时进行更新。当您调用“observeSingleEvent”时,通常会执行相同的操作,但在第一个结果后停止侦听。但是,启用持久性后,第一个结果通常来自缓存。但是,该呼叫将调用后台更新。
我相信这里发生的事情是:
那就是说,我没有责备这个来确认。但是,一个测试是将单个事件设置为常规侦听器,并且只是在收到一个事件时取消侦听器。在连接状态下,应该更喜欢从后端获取状态,因此您应该看到删除了注释的注释Feed(删除的注释永远不会触发,但这是因为初始状态是连贯的)。