使用Firebase持久性时,删除子项时不会调用.childRemoved *

时间:2017-05-17 20:32:34

标签: ios firebase firebase-realtime-database

我遇到了一个问题,确保在使用持久性时数据与数据库同步。在你逃跑之前,我只是对一个特定的行为有疑问,我想知道我做错了什么或者这是否是预期的行为。

以下是我使用的基本设置:

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。哪个会在屏幕上留下过时的数据。考虑到数据已被删除,因此无法发送快照,我可以看到这可能是预期的行为。

如果是这种情况,那么确保用户未被提交已删除的评论的正确做法是什么?

如果需要澄清,请告诉我!谢谢。

1 个答案:

答案 0 :(得分:0)

我认为这里发生的是由持久性行为引起的微妙种族。

当您调用observe时,您将设置一个侦听器,该侦听器将在发生更改时进行更新。当您调用“observeSingleEvent”时,通常会执行相同的操作,但在第一个结果后停止侦听。但是,启用持久性后,第一个结果通常来自缓存。但是,该呼叫将调用后台更新。

我相信这里发生的事情是:

  • 在没有听众的情况下,评论Feed中会删除评论
  • 附加单个事件,并返回包含已删除注释的缓存状态
  • 在添加childRemoved侦听器之前,更新了评论供稿
  • 添加了childRemoved侦听器,但不会触发

那就是说,我没有责备这个来确认。但是,一个测试是将单个事件设置为常规侦听器,并且只是在收到一个事件时取消侦听器。在连接状态下,应该更喜欢从后端获取状态,因此您应该看到删除了注释的注释Feed(删除的注释永远不会触发,但这是因为初始状态是连贯的)。