Firebase:如何在observeSingleEvent() 之后删除Observer(withHandle:)?

Posted

技术标签:

【中文标题】Firebase:如何在observeSingleEvent() 之后删除Observer(withHandle:)?【英文标题】:Firebase : How to removeObserver(withHandle:) after observeSingleEvent()? 【发布时间】: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(...) 创建)吗?

提前谢谢你

【问题讨论】:

查看我的更新答案 【参考方案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 了解如何处理这个特定问题。

以上是关于Firebase:如何在observeSingleEvent() 之后删除Observer(withHandle:)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在firebase中获得firebase时间

如何在 firebase-functions 中使用 firebase.auth()?

如何在 firebase 托管的 webapp 中获取 firebase 函数 URL?

如何在不使用 Firebase 身份验证的情况下保护 Firebase 存储? (下一个)

如何在 Firebase 中定义会话指标

如何使用firebase函数返回保存在firebase存储中的文件的json内容