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-functions 中使用 firebase.auth()?
如何在 firebase 托管的 webapp 中获取 firebase 函数 URL?