我正在尝试检查我的数据库中是否存在用户,但无论用户是否存在,它总是会显示“成功”。我不太了解FireBase文档,它们非常糟糕,任何人都可以帮助我并告诉我为什么每次都能获得成功吗?
if nickTextField.text != "" {
let db = Database.database().reference()
var userExistsSwitch = false
db.child("Usernames").observe(.value, with: { (snapshot) in
if snapshot.hasChild("\(self.nickTextField.text!)") {
userExistsSwitch = true
print("Username already exists!")
}
})
db.child("Usernames").removeAllObservers()
if !userExistsSwitch {
print("Success!")
db.child("Usernames").child(self.nickTextField.text!).setValue(self.nickTextField.text!)
}
}
答案 0 :(得分:0)
从Firebase加载数据是异步发生的。这意味着打印成功的代码在数据实际加载之前运行。最简单的方法是使用一些好的位置日志语句:
let db = Database.database().reference()
print("Before attaching observer");
db.child("Usernames").observe(.value, with: { (snapshot) in
print("Data has loaded");
})
print("After attaching observer");
运行此代码时,会打印:
在加入观察者之前
附上观察员后
已加载数据
无法改变此行为。它只是大多数现代网络的工作方式。
这意味着您必须将需要数据的任何代码放入完成处理程序,或者从完成侦听器中调用它。在您的情况下,这是一种简单的方法:
let db = Database.database().reference()
var userExistsSwitch = false
db.child("Usernames").observe(.value, with: { (snapshot) in
db.child("Usernames").removeAllObservers()
if snapshot.hasChild("\(self.nickTextField.text!)") {
userExistsSwitch = true
print("Username already exists!")
}
if !userExistsSwitch {
print("Success!")
db.child("Usernames").child(self.nickTextField.text!).setValue(self.nickTextField.text!)
}
})