2017-11-28 16 views
0

ユーザーがデータベースに存在するかどうかを確認しようとしていますが、ユーザーが存在するかどうかにかかわらず常に「成功」​​と表示されます。私は本当にFireBaseのドキュメントを理解していない、彼らはかなり貧しいです、誰も私を助け、私は毎回成功を得る理由を教えてくれますか?Firebase適切に動作していないユーザーがいますか?

 if nickTextField.text != "" { 

    let db = Database.database().reference() 

     var userExistsSwitch = false 
     db.child("Usernames").observe(.value, with: { (snapshot) in 
      if snapshot.hasChild("\(self.nickTextField.text!)") { 
       userExistsSwitch = true 
       print("Username already exists!") 
      } 
     }) 

     db.child("Usernames").removeAllObservers() 

     if !userExistsSwitch { 
      print("Success!") 
      db.child("Usernames").child(self.nickTextField.text!).setValue(self.nickTextField.text!) 
     } 

    } 

答えて

0

Firebaseからのデータのロードは非同期で行われます。これは、データが実際にロードされる前に、成功を表示するコードが実行されることを意味します。これを見るための最も簡単な方法は、いくつかの井戸の場所にある文をログ:

let db = Database.database().reference() 
print("Before attaching observer"); 
db.child("Usernames").observe(.value, with: { (snapshot) in 
    print("Data has loaded"); 
}) 
print("After attaching observer"); 

あなたはこのコードを実行すると、それは印刷します

を観測

を取り付けた後、観察

を取り付ける前に、

データがロードされました

ありますこの動作を変更する方法はありません。それは単に現代のウェブの大部分が動作する方法です。

これは、データを必要とするコードを補完ハンドラに入れるか、補完リスナから呼び出す必要があることを意味します。あなたのケースでこれを行う簡単な方法:

let db = Database.database().reference() 

var userExistsSwitch = false 
db.child("Usernames").observe(.value, with: { (snapshot) in 
    db.child("Usernames").removeAllObservers() 
    if snapshot.hasChild("\(self.nickTextField.text!)") { 
     userExistsSwitch = true 
     print("Username already exists!") 
    } 
    if !userExistsSwitch { 
     print("Success!") 
     db.child("Usernames").child(self.nickTextField.text!).setValue(self.nickTextField.text!) 
    } 
}) 
+0

ありがとうございます。私を助けてくれました。あなたが貼り付けたコードは、 'snapshot.hasChild'メソッドの中で' userExistsSwich'がfalseであるかどうかをチェックしているので動作していません。私はそれを編集した – AndreiVataselu

関連する問題