Ios Firebase闭包中的Access变量
我有以下Firebase查询,其中我检查数据库中是否已经存在用户名。我想给一个名为usernameAlreadyExists的变量分配一个布尔值(true)。但是,我需要在闭包之外使用这个变量的新值来访问它。我读到我需要实现completionHandler或回调来实现这一点。但是,我不知道如何在Firebase查询语法中实现这一点:Ios Firebase闭包中的Access变量,ios,swift,firebase,firebase-realtime-database,completionhandler,Ios,Swift,Firebase,Firebase Realtime Database,Completionhandler,我有以下Firebase查询,其中我检查数据库中是否已经存在用户名。我想给一个名为usernameAlreadyExists的变量分配一个布尔值(true)。但是,我需要在闭包之外使用这个变量的新值来访问它。我读到我需要实现completionHandler或回调来实现这一点。但是,我不知道如何在Firebase查询语法中实现这一点: var usernameAlreadyExists = false FIRDatabase.database().reference().child("user
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)
打印(usernameAlreadyExists)-->我希望此行打印“true”,但它打印“false”,因为上面的代码是异步执行的
任何帮助都是非常受欢迎的。谢谢大家! 当您打印
用户名readyExists
变量时,您会看到一个false
值,因为您是正确的。该程序将非常快速地运行您的代码,包括打印,然后当Firebase完成其查询时,它会将您的usernameAReadyExists
的值添加到true
清楚了吗
另外,对于回调或完成处理程序,您的Firebase代码中已经有了它。中的部分快照是完成处理程序的开始
如果要将变量打印为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)
})
func userDidStopTypingUsername() {
// Firebase query here.
// Then if existing, do something and store the value too in your bool variable.
}
编辑:OP希望在注册前验证用户名是否存在
检测用户何时停止在用户名文本字段内键入
参考:
在上面的函数检测中,将您正在使用的Firebase函数张贴在您的问题中,如下所示:
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)
})
func userDidStopTypingUsername() {
// Firebase query here.
// Then if existing, do something and store the value too in your bool variable.
}
另外,在iAction或注册按钮的函数中,也验证用户名readyExists
。如果存在,那么做一些事情并返回,以防止继续注册。否则,请继续
非常感谢您对prettyitgirl.com的解释!但是,我需要在闭包之外访问这个变量。在当前示例中,我用print()表示这一点,只是为了反映代码应该具有的行为。但稍后,我将需要在代码中使用变量的更改值(从false到true)。我需要根据变量的值运行一些代码,如下所示:if usernameareadyexists{//Do something}else{//Do something}。我有办法做到这一点吗?再次感谢!嗨,我想你正在为你的注册做用户名的验证,对吗?或者您想在用户完成或停止在文本字段中键入时立即验证用户名吗?这是正确的。我想在用户注册之前验证用户名。其想法是,用户信息将在注册过程结束时写入数据库。这样,如果用户在注册过程中杀死了应用程序,则不会向DB写入任何数据。上面的代码让我可以检测用户名是否已经被实时获取。但是,我需要一种方法来检查用户名是否未被使用,据我所知,Firebase查询无法执行此操作,这就是为什么我希望获得上述查询的结果并将其用作参考。嘿,请检查我编辑的答案。我的问题是,无论数据库中是否存在相同的用户名,我必须在回答的第三步中验证的userAlreadyExists的值始终等于“false”。换句话说,当我在Firebase查询中将userAlreadyExists设置为“true”时,我只能在这个Firebase查询中访问userAlreadyExists的这个“true”值,因此我想在其中使用userAlreadyExists的整个代码必须在这个Firebase查询中。我需要能够在查询之外使用userAlreadyExists的“true”值(需要回调)。谢谢