2016-09-09 10 views
0

ユーザーが入力したユーザー名が一意で、現在データベースに存在するユーザー名と一致しないことを確認しようとしています。私はこのことについてStackoverflowに関する多くの類似の質問を見つけましたが、それらのどれも私のために働くようです。私は現在の線に沿って何かを使用しています一意のユーザー名(Firebase)を確認できません

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と表示されます。コードの再構築に関する推奨事項はありますか?

+0

これはコードでどのように見えるか? 「データが存在するかどうかをチェックしようとすると、常にfalseと表示されます」 –

答えて

2

これは動作しません。 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") 

これの出力は次のようになります。

オブザーバーでオブザーバー

を取り付けた後、観察

を取り付ける前に、ブロック

おそらくnあなたが期待したオーダー。前述のように、コードはクエリ部分の後に続き、ブロックは後で呼び出されます。

解決策は、あなたの考え方を再構成することです。今すぐあなたのコードは「最初に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) 
    } 

これは、「リアクティブプログラミングスタイル」または「イベントドリブンプログラミング」と呼ばれることがよくあります。ですから、あなたがそれらの用語を見れば、あなたは今それらを習得しました。 :-)

+1

これは例外的な答えでした。私はこれらのトピックについてもっと学ぶのを助けてくれて本当にありがとう! –

+1

よろしくお願いします。 "非同期のハードル"は、ほとんどの開発者にとって大きな喜びの瞬間のひとつであり、コードの実行方法を単純に示していけば、乗り越えるのが最も簡単です。公正な警告:今後数ヶ月、数年にわたって、このために同じ重量を再び経験します。かなり大きなハードルです。 :-) –

関連する問題