2016-06-15 128 views
6

我有一個應用程序,在用戶使用Firebase身份驗證後,它會將數據存儲在Firebase數據庫中。在存儲數據之前,我想檢查用戶給出的用戶名是否已經存在於數據庫中。所以如果它不存在,我可以給用戶這個唯一的用戶名(就像每個用戶都有一個唯一的用戶名一樣)。所以我有一個textField用戶輸入他的用戶名,然後按下一步。然後,應用程序應該檢查用戶名是否存在,並告訴用戶是否需要更改它。檢查用戶是否存在Firebase 3.0 + swift

因此,代碼我用來檢查用戶名存在:

 let databaseRef = FIRDatabase.database().reference() 

     databaseRef.child("Users").observeSingleEventOfType(.Value, withBlock: { (snapshot) in 

      if snapshot.hasChild(self.usernameTextField.text!){ 

       print("user exist") 

      }else{ 

       print("user doesn't exist") 
      } 
     }) 

所以每下一個按下按鈕時,該代碼就會被調用。問題在於結果始終與第一次搜索保持一致(即使在textField值更改後)。 例如,如果我搜索何塞,何塞和我的數據庫存在,所以打印「用戶存在」。但是當我將textField更改爲不存在的名稱時,它仍顯示「用戶存在」。

+0

很高興聽到您發現錯誤。在允許用戶聲明一個唯一的用戶名時,還需要考慮一下這個問題:http://stackoverflow.com/questions/25294478/how-do-you-prevent-duplicate-user-properties-in-firebase –

回答

4

我想通了,我需要改變.ValueFIRDataEventType.Value

if (usernameTextField.text?.isEmpty == false){ 
     let databaseRef = FIRDatabase.database().reference() 

     databaseRef.child("Users").observeSingleEventOfType(FIRDataEventType.Value, withBlock: { (snapshot) in 

      if snapshot.hasChild(self.usernameTextField.text!){ 

       print("true rooms exist") 

      }else{ 

       print("false room doesn't exist") 
      } 


     }) 
+2

如果數據庫中的用戶越多,這會不會花費更長的時間? – WYS

+0

是的你是對的。也許更聰明的方法是對觀察者進行「平等」的查詢。 @WYS –

0
struct ModelUser { 
    var id: String 
    var name: String 

    init(data: DataSnapshot) { 
     // do init stuff 
    } 
} 

func isUserRegistered(with id: String, completion: @escaping (_ exists: Bool, _ user: ModelUser?) ->()) { 
    DatabaseReference.users.child(id).observeSingleEvent(of: .value) { (snapshot) in 
     if snapshot.exists() { 
      // user is already in our database 
      completion(true, ModelUser(data: snapshot)) 
     } else { 
      // not in database 
      completion(false, nil) 
     } 
    } 
} 

這在類似的情況爲你爲我工作。你也可以像這樣使用Rx方式。

enum CustomError: Error { 
    case userNotRegistered 

    var localizedDescription: String { 
     switch self { 
     case .userNotRegistered: 
      return "Dude is not registered..." 
     } 
    } 
} 

func isUserRegistered(with id: String) -> Observable<(ModelUser)> { 
    let reference = DatabaseReference.users.child(id) 

    return Observable<ModelUser>.create({ observer -> Disposable in 
     let listener = reference.observe(.value, with: { snapshot in 
      if snapshot.exists() { 
       observer.onNext(ModelUser(data: snapshot)) 
       observer.onCompleted() 
      } else { 
       observer.onError(CustomError.userNotRegistered) 
      } 
     }) 
     return Disposables.create { 
      reference.removeObserver(withHandle: listener) 
     } 
    }) 
} 

這兩種情況下的關鍵是使用快照的.exists()方法。