在firebase中如何删除所有观察者,而不是特定参考的观察者

Posted

技术标签:

【中文标题】在firebase中如何删除所有观察者,而不是特定参考的观察者【英文标题】:in firebase how to remove all observers, rather than observers for a specific ref 【发布时间】:2015-04-02 11:15:05 【问题描述】:

我正在创建一个带有 signOut 的 firebase 应用。我的问题是

   class func signOut(callback:((error:NSError?)->Void)) 
        let ref = Firebase(url:firebaseHost)
        ref.unauth()
        ref.removeAllObservers()
        let err = UserCredentials.delete()
        callback(error:err)
    

只删除根引用的观察者?我想删除在应用程序的其他部分中针对几个不同查询设置的所有观察者。

我是否必须让 ref... 并重新创建所有这些引用才能删除观察者?

unauth 会断开并移除观察者吗?客户端是否有简单的断开连接方法?

【问题讨论】:

【参考方案1】:

要使用 removeAllObservers,您必须使用用于设置观察者的 var。 您必须为您设置观察者的 firebase 中的每条不同路径执行此操作。 不可能说“删除所有路径的所有观察者”。

【讨论】:

【参考方案2】:

截至本答案发布之日,带有 firebase 库的最新版本的 Swift 3。

在您使用的每个视图控制器中,您可以有一个变量作为对 Firebase 的数据库引用:

var ref: FIRDatabaseReference!

然后在您的 viewdidload 方法中初始化引用:

 override func viewDidLoad() 
    super.viewDidLoad()

    self.ref = FIRDatabase.database().reference()
    self.ref.child("child").observeSingleEvent(of: .value, with:  (snapshot) -> Void in

                // observer code
            )
    // other code
 

然后,当用户不再在其中时,您可以通过 deinitializer 删除该 ViewController 中引用的所有观察者

deinit 
    self.ref.child("child").removeAllObservers()

根据link,这是 deinit 的工作原理:

在释放类实例之前立即调用取消初始化程序。您使用 deinit 关键字编写反初始化程序,类似于使用 init 关键字编写初始化程序的方式。反初始化器仅适用于类类型。

也可以从特定的观察者那里获取一个 UInt,然后通过以下方式将其移除:

// Assign the Uint to your var "handle"
self.handle = self.ref.child("child").observeSingleEvent(of: .value, with:  (snapshot) -> Void in


            )
// Use this to remove the observer when you are done
self.ref.child("child").removeObserver(withHandle: self.handle)

**注意观察者从你声明的同一个子引用中删除是很重要的。

self.ref.removeAllObservers()

不起作用

**

我花了一些时间来理解它是如何工作的...... 希望它可以帮助任何人。

【讨论】:

看起来 SDK 在编写后发生了变化。 observeSingleEventOfType 返回 void 所以最后一个例子是不可能的。【参考方案3】:

可以在 firebase 的官方文档中找到关于此的明确说明。摘自 firebase official documentation。

当您离开时,观察者不会自动停止同步数据 视图控制器。如果观察者没有被正确移除,它会继续 同步数据到本地内存。当不再需要观察者时, 通过将关联的 FIRDatabaseHandle 传递给 removeObserverWithHandle 方法。

当您将回调块添加到引用时,FIRDatabaseHandle 是 回来。这些句柄可用于移除回调块。

如果已将多个侦听器添加到数据库引用中,则每个 引发事件时调用侦听器。为了停止同步 该位置的数据,您必须删除该位置的所有观察者 调用 removeAllObservers 方法。

在侦听器上调用 removeObserverWithHandle 或 removeAllObservers 不会自动删除在其子节点上注册的侦听器; 您还必须跟踪要删除的那些引用或句柄 他们。

要删除所有可以使用的观察者

[[[FIRDatabase database] reference] removeAllObservers];

【讨论】:

以上是关于在firebase中如何删除所有观察者,而不是特定参考的观察者的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 获取特定父级而不是所有子级 SWIFT

如何从谷歌地图中删除特定的多个标记而不是单个或所有标记

如何根据特定时间删除 Firebase 数据库中的项目

Firebase 删除的数据仍然存在

如何让 Firebase Functions 充当用户而不是管理员?

如何从 ListView 中删除一个项目并在 Firebase 上删除它?