[英]Cannot check for unique username (Firebase)
我正在嘗試檢查用戶輸入的用戶名是否唯一,並且與數據庫中當前未匹配。 我在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
}
這很好用,並且可以接收快照。 但是,當我嘗試檢查數據是否存在時,總是將其顯示為false。 關於重組代碼有什么建議嗎?
那不管用。 從Firebase數據庫加載數據需要花費時間,並且異步發生(幾乎與現代Web編程幾乎一樣)。 這意味着在加載數據時,您的主代碼會繼續。 然后,當數據可用時,將調用您的callback / 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)
}
這通常被稱為“反應式編程風格”或“事件驅動式編程”。 因此,如果您看到這些術語:您現在已經掌握了它們。 :-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.