检查用户是否存在firebase 3.0 + swift

时间:2016-06-15 01:14:21

标签: ios swift firebase firebase-realtime-database

我有一个应用,在用户使用Firebase身份验证后,它会将数据存储在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")
            }
        })  

因此,每次按下下一个按钮,都会调用此代码。这样做的问题是结果始终与第一次搜索相同(即使在textField值更改之后)。 例如,如果我搜索Jose,并且Jose存在于我的数据库中,那么将打印“user exists”。但是当我将textField更改为不存在的名称时,它仍然显示“用户存在”。

2 个答案:

答案 0 :(得分:4)

我发现我需要将.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")
            }


        })

答案 1 :(得分:2)

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()方法。