Проверьте, существует ли пользователь с firebase 3.0 + swift

у меня есть приложение, которое после использования пользователем Firebase auth хранит данные в базе данных Firebase. Прежде чем хранить данные, я хочу проверить, существует ли имя пользователя, которое пользователь дает в базе данных. Поэтому, если его не существует, я могу дать пользователю это уникальное имя пользователя (как и у каждого пользователя есть уникальное имя пользователя). Так что у меня есть textField где пользователь вводит свое имя пользователя, а затем нажмите кнопку Далее. Затем приложение должно проверить, существует ли имя пользователя или нет, и сообщить пользователю, если ему нужно изменить он.

Итак, код, который я использовал, чтобы проверить, существует ли имя пользователя:

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

поэтому каждый раз, когда нажимается следующая кнопка, этот код вызывается. Проблема в том, что результат всегда остается таким же, как и при первом поиске (даже после изменения значения текстового поля). Например, если я ищу Jose, а Jose существует в моей базе данных, так будет печатать "user exist". Но когда я меняю textField для имени, которое не существует, он по-прежнему показывает "пользователь существует".

2 ответов


я понял, что мне нужно изменить .Value to 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 () моментального снимка.