我有以下Firebase查询,其中检查数据库中是否已存在用户名。我想为一个名为usernameAlreadyExists的变量赋一个布尔值(true)。但是,我需要在闭包之外使用其新值来访问此变量。我读到我需要实现completionHandler或回调才能执行此操作。但是,我不知道如何在Firebase查询语法中实现此功能:
['Painted', 'Wood', 'Mirror', 'Gold Leaf']
打印(usernameAlreadyExists) - >我希望这行打印" true",但它打印" false"因为上面的代码是异步执行的。
任何帮助都非常受欢迎。谢谢!
答案 0 :(得分:0)
当您打印false
变量时,您看到userNameAlreadyExists
值,因为只是您是正确的。该程序将非常快速地运行您的代码,包括打印,然后当Firebase完成查询时,它会将userNameAlreadyExists
的值更改为true
。
这是清楚的吗?
此外,对于回叫或完成处理程序,您已在Firebase代码中使用此功能。部分snapshot in
是完成处理程序的开头。
如果要将变量打印为true,则将其置于完成处理程序中,如下所示:
var usernameAlreadyExists = false
FIRDatabase.database().reference().child("usernames").queryOrderedByValue().queryEqual(toValue: self.username.text).queryLimited(toFirst: 1).observe(.childAdded, with: { snapshot in
// Username unavailable, chose another one
self.invalidUsernameMsg.text = "This username already exists, please choose another one."
print(snapshot)
print(snapshot.value)
usernameAlreadyExists = true
print(usernameAlreadyExists)
})
编辑:OP希望在注册前验证用户名是否存在。
检测用户何时停止在用户名textField 内输入内容 参考:https://stackoverflow.com/a/29763089/3231194
在上面的检测功能中,将您使用的Firebase功能发布到您的问题中,如下所示:
func userDidStopTypingUsername() {
// Firebase query here.
// Then if existing, do something and store the value too in your bool variable.
}
此外,在您的IBAction或注册按钮的功能中,也验证userNameAlreadyExists
。如果存在,则执行某些操作并返回以防止继续注册。否则,继续。