Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Firebase闭包中的Access变量_Ios_Swift_Firebase_Firebase Realtime Database_Completionhandler - Fatal编程技术网

Ios Firebase闭包中的Access变量

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

我有以下Firebase查询,其中我检查数据库中是否已经存在用户名。我想给一个名为usernameAlreadyExists的变量分配一个布尔值(true)。但是,我需要在闭包之外使用这个变量的新值来访问它。我读到我需要实现completionHandler或回调来实现这一点。但是,我不知道如何在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)
打印(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”值(需要回调)。谢谢