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

in firebase how to remove all observers, rather than observers for a specific ref

我正在创建一个带有注销功能的 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 会断开连接并移除观察者吗?客户端是否有简单的断开连接方法?

要使用 removeAllObservers,您必须使用您用来设置观察者的变量。 对于设置观察者的 firebase 中的每条不同路径,您都必须这样做。 不可能说 "remove all observers for all paths".

Swift 3 使用 firebase 库的最新版本到这个答案的日期。

在您使用的每个视图控制器中,您可以有一个变量,它是对 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 是这样工作的:

A deinitializer is called immediately before a class instance is deallocated. You write deinitializers with the deinit keyword, similar to how intializers are written with the init keyword. Deinitializers are only available on class types.

也可以从特定的观察者那里获取一个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()

不行

**

我花了一些时间才明白它是如何工作的... 希望对大家有帮助。

firebase 的官方文档中对此有明确说明。从 firebase 中提取 official documentation.

Observers don't automatically stop syncing data when you leave a ViewController. If an observer isn't properly removed, it continues to sync data to local memory. When an observer is no longer needed, remove it by passing the associated FIRDatabaseHandle to the removeObserverWithHandle method.

When you add a callback block to a reference, a FIRDatabaseHandle is returned. These handles can be used to remove the callback block.

If multiple listeners have been added to a database reference, each listener is called when an event is raised. In order to stop syncing data at that location, you must remove all observers at a location by calling the removeAllObservers method.

Calling removeObserverWithHandle or removeAllObservers on a listener does not automatically remove listeners registered on its child nodes; you must also keep track of those references or handles to remove them.

要移除所有观察者,您可以使用

[[[FIRDatabase database] reference] removeAllObservers];