检查密钥是否存在firebase 4和swift 4?

Mic*_*Hsu 2 ios firebase swift firebase-realtime-database

如何检查Firebase中是否存在密钥?我在这里看到了这个链接,但它适用于Firebase 3,它对我的​​情况不起作用.所以对于我的情况,我想检查是否存在用户名,如果存在,则不注册用户,但如果没有,则注册.我有类似的东西:

        let usersDB = Database.database().reference().child("Users")
        var taken = false

        usersDB.observeSingleEvent(of: .value, with: { (snapshot) in
            if snapshot.hasChild(username) {
                taken = true
                self.errorLabel.text = "Username already taken."
            }
        })

        if !taken {
            // Email registration
            Auth.auth().createUser(withEmail: email, password: password, completion: { (user, error) in
                if error != nil {
                    print(error!.localizedDescription)
                    self.errorLabel.text = error!.localizedDescription
                } else {
                    // Allows for username log in
                    usersDB.child(username).setValue(["email" : user?.email])
                    self.performSegue(withIdentifier: "goToGroups", sender: self)
                }
            })
        }
Run Code Online (Sandbox Code Playgroud)

observeSingleEvent是以前类似帖子的解决方案,但它只在我在这一行上添加一个孩子之后运行usersDB.child(username).setValue(["email" : user?.email]),它从未运行过.有没有其他方法可以做到这一点?

Jen*_*son 9

这看起来像是处理异步调用的问题.if !taken很可能在返回数据之前检查observeSingleEvent它是因为它是异步的,所以其余的代码将继续运行.一种选择是if !taken进入闭包,如下所示:

    let usersDB = Database.database().reference().child("Users/\(username)")
    var taken = false

    usersDB.observeSingleEvent(of: .value, with: { (snapshot) in
        if snapshot.exists() {
            taken = true
            self.errorLabel.text = "Username already taken."
        }
        if !taken {
            // Email registration
            Auth.auth().createUser(withEmail: email, password: password, completion: { (user, error) in
                if error != nil {
                    print(error!.localizedDescription)
                    self.errorLabel.text = error!.localizedDescription
                } else {
                    // Allows for username log in
                    usersDB.child(username).setValue(["email" : user?.email])
                    self.performSegue(withIdentifier: "goToGroups", sender: self)
                }
            })
        }
    })
Run Code Online (Sandbox Code Playgroud)