【问题标题】:Firebase 'Observe' called multiple times with Swift on iOS在 iOS 上使用 Swift 多次调用 Firebase 'Observe'
【发布时间】:2017-04-27 22:47:57
【问题描述】:

当我在 Firebase 数据库节点上启动 observer 时,我注意到即使没有数据更改,Firebase 也会继续调用方法 observer

这是我的设置:

FIRDatabase
    .database()
    .reference(withPath: "test")
    .observe(FIRDataEventType.value, with: { (snapshot) in
            print("Firebase Data Updated");
    }
);

当我对 Firebase 数据库进行 一次 更改时,observer 会多次调用其闭包函数。

Firebase 数据已更新

Firebase 数据已更新

Firebase 数据已更新

Firebase 数据已更新

Firebase 数据已更新

Firebase 数据已更新

Firebase 数据已更新

...

为什么会发生这种情况? 我怎样才能阻止这种情况的发生,并且在更新后只接到一个电话给observer

【问题讨论】:

  • 一旦注册了监听器块,即使用户注销,它也会保持注册状态。当视图消失时,你是否分离了你的监听器?
  • 感谢您的回复。是的,但问题是当侦听器被多次触发时,只有一次数据更新。数据更新时监听器不应该只触发一次吗?
  • 你的代码中哪里调用了这个函数?
  • 在 appDidLaunchWithOptions 中调用
  • 您问题中的代码本身很好,您的想法是正确的,只要测试节点的子节点发生变化,就会调用闭包。实际上没有足够的附加代码来绘制关于正在发生的事情的上下文 - 您可能已将另一个观察者附加到节点,或者可能更改测试节点的代码格式错误。如果您可以包含更多代码,我们可能会确定它。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

这个观察者很可能被多次注册。当用户注销时,您注册的侦听器块保持注册状态,因此当用户再次登录时,您正在注册第二个侦听器。

捕获观察者的refhandle 并在完成处理后(即用户注销时)移除句柄通常是一种很好的做法。你可以这样做:

ref, handle = FIRDatabase
    .database()
    .reference(withPath: "test")
    .observe(FIRDataEventType.value, with: { (snapshot) in
            print("Firebase Data Updated");
    }
);

退出时:

ref.removeObserverWithHandle(handle)

否则,确保它只被调用一次的另一种可能的解决方案是使用.observeSingleEvent() 而不是.observe()

【讨论】:

  • @leonardlooi 使用 .observeSingleEvent() 而不是 .observe() 并保存了我的项目。衷心感谢。!
【解决方案2】:
Swift 4: 
If you want to remove all listeners registered with test node.
    Database.database().reference(withPath: "test").removeAllObservers()

If you want to remove particular listener then you need particular handler for observer. You can use following sample code.
    let ref = Database.database().reference(withPath: "test")
            let handler = ref.observe(.value) { (snapshot) in
            }
            ref.removeObserver(withHandle: handler)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 2020-05-07
    相关资源
    最近更新 更多