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

Mon*_*key 5 ios firebase

我正在使用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)
    }
Run Code Online (Sandbox Code Playgroud)

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

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

unauth是否会断开并删除观察者?是否有客户端的jusa简单断开方法?

小智 5

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


Man*_* BM 5

Swift 3 与 firebase 库的最新版本到此答案的日期。

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

var ref: FIRDatabaseReference!
Run Code Online (Sandbox Code Playgroud)

然后在您的 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
 }
Run Code Online (Sandbox Code Playgroud)

然后,当用户不再通过析构器位于该 ViewController 中时,您可以删除该 ViewController 中引用的所有观察者

deinit {
    self.ref.child("child").removeAllObservers()
}
Run Code Online (Sandbox Code Playgroud)

根据此链接,这是 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)
Run Code Online (Sandbox Code Playgroud)

**注意观察者已从您声明的同一个子引用中删除,这一点很重要。

self.ref.removeAllObservers()

行不通

**

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