无法检查唯一用户名(Firebase)

Posted

技术标签:

【中文标题】无法检查唯一用户名(Firebase)【英文标题】:Cannot check for unique username (Firebase) 【发布时间】:2016-09-09 18:37:00 【问题描述】:

我正在尝试检查用户输入的用户名是否唯一,并且与数据库中当前的任何用户名都不匹配。我在 *** 上发现了很多类似的问题,但似乎没有一个对我有用。以下是我当前的数据结构:

users
    -C3M483C28M34C29834C (uid)
        • username: "myUsername"

我目前正在使用以下内容:

let ref = FIRDatabase.database().reference()

var usernameTaken = false
ref.child("users").queryOrderedByChild("username").queryEqualToValue(username.text?.uppercaseString).observeSingleEventOfType(.Value, withBlock:  snapshot in
  if snapshot.exists()
    usernameTaken = true
  else
    usernameTaken = false
  
)  error in
  print(error.localizedDescription)


if usernameTaken == false
  //do stuff with unique username

这很好用,并且收到了快照。但是,当我尝试检查数据是否存在()时,总是将其显示为假。有什么关于重构代码的建议吗?

【问题讨论】:

你能在代码中展示它的样子吗? “当我尝试检查数据是否存在()时,总是显示为假” 【参考方案1】:

那是行不通的。从 Firebase 数据库加载数据需要时间并且异步发生(就像几乎所有现代 Web 编程一样)。这意味着您的主代码在加载数据时继续。然后当数据可用时,你的回调/withBlock 被调用。您可以通过在代码中添加一些日志记录来最轻松地看到这一点:

print("Before attaching observer")
ref.child("users")
   .queryOrderedByChild("username")
   .queryEqualToValue(username.text?.uppercaseString)
   .observeSingleEventOfType(.Value, withBlock:  snapshot in
       print("In observer block")
   )
print("After attaching observer")

这个输出将是:

附加观察者之前

附加观察者后

在观察者块中

这可能不是您期望的顺序。如前所述,代码在查询部分之后继续,您的块稍后会被调用,可能会更晚。

解决方案是重新构建您的思维方式。现在你的代码是“先做 abc,然后做 xyz”。如果改成“当abc发生时,用它做xyz”,你的问题一下子就少了。

ref.child("users")
   .queryOrderedByChild("username")
   .queryEqualToValue(username.text?.uppercaseString)
   .observeSingleEventOfType(.Value, withBlock:  snapshot in
       if !snapshot.exists()
           //do stuff with unique username
       
   )  error in
       print(error.localizedDescription)
   

这通常被称为“反应式编程风格”或“事件驱动编程”。因此,如果您看到这些术语:您现在已经掌握了它们。 :-)

【讨论】:

这是一个特殊的答案。非常感谢您抽出宝贵时间帮助我了解有关这些主题的更多信息! 不客气,马特。对于大多数开发人员来说,“异步障碍”是重大的 wtf 时刻之一,如果我简单地展示你的代码是如何执行的,那么它最容易克服。公平警告:在接下来的几个月/几年中,您将多次重新体验相同的 wtf。这是一个相当大的障碍。 :-)

以上是关于无法检查唯一用户名(Firebase)的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 Firebase 数据库中的唯一用户名(swift)

如何检查 Firebase 数据库中用户输入数据的唯一性?迅速

无法使用唯一键从 Firebase 检索用户位置数据

带有 Flutter 的 Firebase 中的唯一用户名

检查firebase子项是不是具有特定值[重复]

firebase 中唯一的用户名,没有变通办法