我使用快速的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(...)
创建)?
提前谢谢
答案 0 :(得分:3)
由于databaseReference.observeSingleEvent(...)
未返回您可以删除的句柄,因此唯一的选择是使用databaseReference.observe(...)
。
只需在第一个事件触发时 OR 手动删除手柄。
尝试使用此扩展程序:
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
}
}