Firebase闭包中的访问变量

时间:2017-02-08 00:25:48

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

我有以下Firebase查询,其中检查数据库中是否已存在用户名。我想为一个名为usernameAlreadyExists的变量赋一个布尔值(true)。但是,我需要在闭包之外使用其新值来访问此变量。我读到我需要实现completionHandler或回调才能执行此操作。但是,我不知道如何在Firebase查询语法中实现此功能:

['Painted', 'Wood', 'Mirror', 'Gold Leaf']

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

任何帮助都非常受欢迎。谢谢!

1 个答案:

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

  1. 检测用户何时停止在用户名textField 内输入内容 参考: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。如果存在,则执行某些操作并返回以防止继续注册。否则,继续。