2015-04-02 41 views
4

我正在創建一個帶有signOut的Firebase應用程序。我的問題是in 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 ...並重新創建所有這些引用,然後刪除觀察者?

是不是斷開連接並刪除觀察者?客戶端是否有簡單的斷開連接方法?

回答

4

要使用removeAllObservers,您必須使用您用於設置觀察者的var。 你必須爲設置觀察者的firebase中的每個不同路徑執行此操作。 沒有可能說「刪除所有路徑的所有觀察者」。

1

Swift 3 with firebase library's latest version to this date of this answer。

在您使用的每個視圖控制器,你可以有一個變量,它是一個數據庫參照火力地堡:

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 
} 

然後當用戶不再通過去初始化器時,您可以刪除該ViewController中所有引用的觀察者。

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

根據這一link這是DEINIT如何工作的:一個類的實例被釋放之前

一個deinitializer立即調用。你用deinit關鍵字編寫deinitializers,類似於初始化關鍵字的初始化方式。取消初始化器僅適用於類類型。

也可能獲得來自特定觀察員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()

都不行

**

它採取了一些時間,我理解它是如何工作的... 希望它能幫助那裏的任何人。