2017-02-26 32 views
1

在我的iOS應用中,用戶可以通過搜索唯一的用戶名來添加好友。如何取消firebase觀察單個事件數據庫調用

用戶在textField中鍵入用戶名,我有一個textFieldDidChange通知,每當文本更改時觸發該通知。

在該方法中,我調用下面的Firebase方法來檢查用戶名是否存在。

func searchFor(_ username: String) { 

    guard let uid = FIRAuth.auth()?.currentUser?.uid else { 
     return 
    } 

    let lowercaseUsername = username.lowercased() 
    let ref = FIRDatabase.database().reference() 

    ref.child(FirebaseDatabaseBranchNames.usernames.rawValue).child(lowercaseUsername).observeSingleEvent(of: .value, with: { [unowned self](snapshot) in 

     if snapshot.exists() { 
      if let usernameUid = snapshot.value as? String { 
       self.isUserAlreadyAFriend(ref, uid: uid, usernameUid: usernameUid) 
      } 
     } else { 
      // username doesn't exist 
     } 

    }, withCancel: nil) 
} 

如何在再次執行此操作前取消此方法?

回答

3

當您附加偵聽器/觀察者時,Firebase會爲該觀察者返回一個句柄。您可以隨後通過撥打ref.removeObserverWithHandle()來移除收聽者/觀看者。

因此,假如你想在最一個觀察者,你可以保持你的類的成員字段,參考和觀察員手柄,然後在searchFor方法使用此代碼:

if (self.searchHandle != nil) { 
    self.searchRef.removeObserverWithHandle(searchHandle) 
} 

self.searchRef = ref.child(FirebaseDatabaseBranchNames.usernames.rawValue).child(lowercaseUsername) 
self.searchHandle = self.searchRef.observeSingleEvent(of: .value, with: { [unowned self](snapshot) in 
    if snapshot.exists() { 
     if let usernameUid = snapshot.value as? String { 
      self.isUserAlreadyAFriend(ref, uid: uid, usernameUid: usernameUid) 
     } 
    } else { 
     // username doesn't exist 
    } 

}, withCancel: nil) 

要知道,你贏了儘管如此,最好的結果是數據庫客戶端只是丟棄從服務器獲得的數據。

+0

一如既往,感謝弗蘭克(需要有這個地方,我可以複製和粘貼:)) – Edward

+0

嗨@Frank假設你不想使用觀察,而不是observeSingleEvent爲了能夠使用手柄刪除它 – Edward

+0

這個問題具體是關於'observeSingleEvent',所以這就是我的回答。在這種情況下,分離偵聽器的用處是相當有限的,但它確實涵蓋了一些邊緣情況。 –

相關問題