【问题标题】:How can I confirm ref.removeAllObservers() has completed?如何确认 ref.removeAllObservers() 已完成?
【发布时间】:2015-07-07 10:46:49
【问题描述】:

我正在寻找类似于 Firebase completion block 的东西,以确认我在切换到下一个 ViewController 之前已删除所有 Firebase 回调

ref.removeAllObservers()
let resultController = self.storyboard!.instantiateViewControllerWithIdentifier("Home") as! UIViewController
self.presentViewController(resultController, animated: true, completion: nil)

【问题讨论】:

  • Firebase API 中没有“显示所有已注册的观察者”方法。就是说:如果您遇到了挥之不去的观察者,您可能在子节点中注册了它们,但只在顶级 ref 上调用了removeAllObservers。您必须从最初注册它的确切 ref/child 中删除每个观察者。请参阅firebase.com/docs/web/api/query/off.html:“在父侦听器上调用 off() 不会自动删除在子节点上注册的侦听器,还必须在任何子侦听器上调用 off() 以删除回调。”
  • 谢谢弗兰克!这是一个巨大的帮助。我没有删除子节点上的观察者 - 这是主要错误
  • 是的,我们最近在 Web API 文档中扩展了该部分,因为这是一个容易犯的错误。我们还应该为 iOS 和 Android 记录它。我将添加我的评论作为答案。

标签: ios swift firebase


【解决方案1】:

Firebase API 中没有“显示所有已注册的观察者”方法。

这就是说:如果您遇到了挥之不去的观察者,您可能在子节点中注册了它们,但只在顶级 ref 上调用了removeAllObservers。您必须从最初注册它的确切 ref/child 中删除每个观察者。

web docs for off

在父侦听器上调用off() 不会自动删除在子节点上注册的侦听器,还必须在任何子侦听器上调用off() 才能删除回调。

【讨论】:

    【解决方案2】:

    是什么让你认为在removeAllObservers() 调用期间没有删除观察者,这个操作是异步的,你应该等待什么?没必要,是同步操作。

    一般情况下,不要使用removeAllObservers() 删除观察者,因为这样您也可以删除其他类添加的观察者。最好将 FirebaseHandles 的数组保留在某处,并在不需要时将它们一一删除。

    Detaching Blocks 描述了它。

    【讨论】:

    • 谢谢罗伯特!保留一组 FirebaseHandles 是有意义的。我的主要问题是我在顶层运行 removeAllObservers 并且它没有关闭我的子节点回调。
    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 2019-05-13
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 2016-09-09
    • 2017-06-21
    相关资源
    最近更新 更多