【问题标题】:Access variable in Firebase closureFirebase 闭包中的访问变量
【发布时间】:2017-06-25 10:41:51
【问题描述】:

我有以下 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)

print(usernameAlreadyExists) --> 我希望这行打印“true”,但它打印“false”,因为上面的代码是异步执行的。

我们非常欢迎任何帮助。谢谢!

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database completionhandler


    【解决方案1】:

    当您打印 userNameAlreadyExists 变量时,您会看到 false 值,因为您是正确的。该程序将非常快速地运行您的代码,包括打印,然后当 Firebase 完成查询时,它会将您的 userNameAlreadyExists 的值更改为 true

    这清楚吗?

    此外,对于回调或完成处理程序,您的 Firebase 代码中已经有了它。 snapshot in 部分是完成处理程序的开始。

    如果你想将你的变量打印为真,那么将它放在完成处理程序中,如下所示:

    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 希望在注册之前验证用户名是否存在。

    1. 检测用户何时停止在 用户名文本字段中输入 参考:https://stackoverflow.com/a/29763089/3231194

    2. 在上面的检测函数中,将您正在使用的 Firebase 函数发布在您的问题中,如下所示:

      func userDidStopTypingUsername() {
          // Firebase query here.
          // Then if existing, do something and store the value too in your bool variable.
      }
      
    3. 此外,在您的 IBAction 或注册按钮的功能中,也验证 userNameAlreadyExists。如果存在,则执行某些操作并返回以防止继续注册。否则,继续。

    【讨论】:

    • 非常感谢prettyitgirl.com的解释!但是,我需要在闭包之外访问这个变量。在当前示例中,我用 print() 表示这一点,只是为了反映代码应该具有的行为。但稍后,我将需要在我的代码中使用变量的更改值(从 false 到 true)。我需要根据变量的值运行一些代码,如下所示:if usernameAlreadyExists { // Do something } else { // Do something else }。我有办法做到这一点吗?再次感谢!
    • 您好,我假设您正在为您的注册验证usernames,对吗?或者您想在用户完成或停止输入文本字段后立即验证用户名?
    • 没错。我想在用户注册之前验证用户名。这个想法是在注册过程结束时将用户信息写入数据库。这样,如果用户在注册过程中终止应用程序,则不会将任何数据写入数据库。上面的代码让我可以实时检测用户名是否已经被使用。但是,我需要一种方法来检查用户名是否未被使用,据我所知,您不能使用 Firebase 查询来执行此操作,这就是为什么我想获得上面查询的结果并将其用作参考.
    • 嘿,请检查我编辑的答案。看看这是不是你想要做的。
    • 我的问题是我必须在答案的第三步验证的 userAlreadyExists 的值始终等于 "false"数据库中是否存在相同的用户名。换句话说,当我在 Firebase 查询中将 userAlreadyExists 设置为 "true" 时,我可以访问 "true" 的值 userAlreadyExists 仅在此 Firebase 查询中,因此我要使用的整个代码 userAlreadyExists 必须在此 Firebase 查询中。我需要能够在查询之外使用 userAlreadyExists"true" 值(需要回调)。谢谢
    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 2016-01-18
    • 2016-06-24
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多