【问题标题】:check if key exists firebase 4 and swift 4?检查密钥是否存在 firebase 4 和 swift 4?
【发布时间】:2018-09-08 17:45:16
【问题描述】:

如何检查 Firebase 中是否存在密钥?我已经看到这个链接here,但它适用于 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)
                }
            })
        }

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

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

    这看起来像是处理异步调用的问题。 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)
                    }
                })
            }
        })
    

    【讨论】:

      猜你喜欢
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多