检查用户是否存在Firebase 3.0 + Swift

我有一个应用程序,用户使用Firebase身份validation后,它将数据存储在Firebase数据库中。 在存储数据之前,我想检查用户给出的用户名是否已经存在于数据库中。 所以,如果不存在,我可以给用户这个唯一的用户名(就像每个用户有一个唯一的用户名)。 所以我有一个textField用户input他的用户名,然后按下一步。 然后应用程序应该检查用户名是否存在,并告诉用户是否需要更改。

所以我用来检查用户名是否存在的代码:

  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") } }) 

所以每当下一个button被按下,这个代码被调用。 这样做的问题是,结果总是保持与第一次search相同(即使在textField值更改后)。 例如,如果我search何塞,何塞和我的数据库存在,所以打印“用户存在”。 但是当我将textField更改为不存在的名称时,它仍显示“用户存在”。

我想通了,我需要将.Value更改为FIRDataEventType.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") } }) 
 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()方法。