2016-06-15 130 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()方法。