【问题标题】:Firebase : How to removeObserver(withHandle:) after observeSingleEvent()?Firebase:如何在observeSingleEvent() 之后删除Observer(withHandle:)?
【发布时间】:2017-04-05 09:05:50
【问题描述】:

我快速使用 Firebase 数据库。当我使用 databaseReference.observe(...) 观察时,我可以轻松地从 DatabaseReference 中删除观察者:

databaseHandle = databaseReference.observe(
    .value, 
    with: { (snapshot) in ... }, 
    withCancel: { (error) in ... })

...

databaseReference.removeObserver(withHandle: databaseHandle)

我的问题是当我使用databaseReference.observeSingleEvent(...) 时。因为它不返回 FIRDatabaseHandle,所以我无法在需要时移除观察者。

我知道databaseReference.observeSingleEvent(...) 会在观察者被触发一次后立即将其移除。但是,有时我需要在观察者被触发之前将其移除。

我也知道我可以使用databaseReference.removeAllObservers(),但这对我来说不是一个方便的解决方案。

你们中有人知道我如何过早地从 databaseReference 中删除 Observer(使用 observeSingleEvent(...) 创建)吗?

提前谢谢你

【问题讨论】:

  • 查看我的更新答案

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

由于databaseReference.observeSingleEvent(...) 不返回可以删除的句柄,唯一的选择是使用databaseReference.observe(...)

当您需要第一个事件触发时手动移除句柄。

更新

尝试使用这个扩展:

public extension FIRDatabaseReference {

    @discardableResult
    public func observeOneEvent(of eventType: FIRDataEventType, with block: @escaping (FIRDataSnapshot) -> Swift.Void) -> FIRDatabaseHandle {

        var handle: FIRDatabaseHandle!
        handle = observe(eventType) { (snapshot: FIRDataSnapshot) in
            self.removeObserver(withHandle: handle)
            block(snapshot)
        }

        return handle

    }

}

【讨论】:

  • 在处理之前可能会调用多个观察者,因此我会添加一个布尔属性 removed 以在删除和处理之前进行预检查。
  • 是的!我同意。我也知道上面的代码可能会以我没有想到的方式进行改进,但这只是为了让 OP 了解如何处理这个特定问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 2016-12-30
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多