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

标签 ios swift firebase firebase-realtime-database

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

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
}

效果很好,快照已收到。但是,当我尝试检查数据是否存在时(),总是显示为假。关于重构代码的任何建议?

最佳答案

那是行不通的。从 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")

这个的输出将是:

Before attaching observer

After attaching observer

In observer block

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

解决方案是重新构建您的思维方式。现在你的代码是“先做 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)
   }

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

关于ios - 无法检查唯一用户名 (Firebase),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39417826/

相关文章:

touchmove 中的 JavaScript DOM 更改延迟到移动 Safari 上的滚动结束

ios - CoreData 未触发故障

android - 是否可以使用 2 个 Crashlytics API key ?

ios - 如何在 swift 3 的 tableview 单元格内单击更改按钮标题

android - 我可以使用 Firebase Storage 进行在线音乐流传输吗?

angularjs - 将记录添加到 Firebase 数据库时发送电子邮件

ios - UIDatePicker 以 5 分钟间隔获取日期并按间隔显示

ios - SWIFTUI:更改 ScreenSize 类后无法关闭工作表

ios - 委托(delegate)方法如何在 Swift 中工作?

ios - 当我尝试在 App Store 上上传新版本时,applink 出现 iTunes 错误 90046