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]),它从未运行过.有没有其他方法可以做到这一点?
这看起来像是处理异步调用的问题.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)
| 归档时间: |
|
| 查看次数: |
1538 次 |
| 最近记录: |