簡體   English   中英

無法檢查唯一的用戶名(Firebase)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM