【问题标题】:FirebaseDatabase - removeAllObservers() - What does it actually remove?FirebaseDatabase - removeAllObservers() - 它实际上删除了什么?
【发布时间】:2018-04-12 04:17:52
【问题描述】:

removeAllObservers() 是否删除所有观察者 为它被调用的 DatabaseReference 实例或指定路径的任何引用?

例如:

MainController.swift

let ref = Database.(...).child("foo/bar").observe(.value, with: handler)



ItemController.swift

public var ref2: DatabaseReference?

public func someMethod() {
    self.ref2 = Database.(...).child("foo/bar").observe(.value, with: handler2)
}

override func viewDidDisappear() {
    self.ref2?.removeAllObservers()
}

来自 MainControllerref 是否仍会观察 foo/bar 路径,否则该观察者也会被移除?

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database observers


    【解决方案1】:

    根据documentation

    如果已将多个侦听器添加到数据库引用中,则每个 引发事件时调用侦听器。为了停止同步 该位置的数据,您必须删除该位置的所有观察者 调用 removeAllObservers 方法。

    在侦听器上调用 removeObserverWithHandle 或 removeAllObservers 不会自动删除在其子节点上注册的侦听器; 您还必须跟踪要删除的那些引用或句柄 他们。

    所以换句话说,您需要将它们全部删除,它们不会被自动删除,并且来自 MainControllerref 仍会观察到。

    【讨论】:

    • 是的,但请记住,我使用两个不同的引用观察完全相同的路径。这才是重点。问题是:我在 MainController 中观察 foo/bar,但是当我浏览应用程序时,我到达 ItemController,它也观察 foo/bar,但删除了AllObservers在 viewDidDisappear 上。 MainController 中的 foo/bar 观察者还会监听变化吗?
    • @jpawlowski 当您删除观察者时,它不再听。确保以正确的形式和正确的路径移除观察者。
    • @jpawlowski,它仍然会听。您需要为所有路径使用removeAllObservers
    • 你的意思是'所有参考'?我在两个不同的地方观察相同的路径,所以我有两个 DatabaseReference 实例观察相同的 foo/bar 路径。
    • @jpawlowski,是的,您需要删除每个班级的观察者。它不会从这两个地方删除。
    【解决方案2】:

    根据他们的文档ref2 仍会观察。

    没有办法删除所有路径的所有观察者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 2020-11-21
      • 2015-02-26
      相关资源
      最近更新 更多