gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 12:40:54 25 4
gpt4 key购买 nike

我正在尝试检查用户输入的用户名是唯一的,并且与数据库中当前存在的任何用户名都不匹配。我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com