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

时间:2017-04-05 09:05:50

标签: ios swift firebase firebase-realtime-database

我使用快速的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 个答案:

答案 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

    }

}