2016-08-19 15 views
0

Firebaseに選択されたユーザー名を持つユーザーが既に存在するかどうかをチェックしたいと思います。これを行う関数checkUsernameAlreadyTaken(username: String) -> Boolを作成しました。Firebaseデータベースの非同期メソッドからの戻り値

func checkUsernameAlreadyTaken(username: String) -> Bool { 
    databaseRef.child("usernames").child("\(username)").observe(.value, with: { (snapshot) in 
     print(username) 
     if snapshot.exists() { 
      print("Snapshot exist") 
      self.alreadyTaken = true 
     } 
    }) 
    if alreadyTaken == true { 
     print("Username already taken") 
     return false 
    } 
    else { 
     return true 
    } 

} 

問題は方法observe(_ eventType: FIRDataEventType, with block: (FIRDataSnapshot) -> Void) -> Uintは非同期メソッドであるということですので、私はあなたが上記を参照できる戦略を使用することはできません。ここで は、コードが機能をPFです。しかし、私はFirebaseメソッドから値を返すことはできません。それはvoidメソッドなので...
この問題をどうやって解決できますか?

もう1つ。接続エラーまたはサーバーとの接続がない場合も、どうすればfalseを返すことができますか?

+0

申し訳ありません言語、私はイタリア人学生です – ale00

答えて

3

あなたは非同期完了ハンドラを自分で利用してインターネット接続があるかどうかを確認する必要があります。

func checkUsernameAlreadyTaken(username: String, completionHandler: (Bool) ->()) { 
    databaseRef.child("usernames").child("\(username)").observe(.value, with: { (snapshot) in 
     print(username) 
     if snapshot.exists() { 
      completionHandler(false) 
     } else { 
      let connectedRef = FIRDatabase.database().reference(withPath: ".info/connected") 
      connectedRef.observe(.value, with: { snapshot in 
       if let connected = snapshot.value as? Bool, connected { 
        completionHandler(true) 
       } else { 
        completionHandler(false) 
        // Show a popup with the description 
        let alert = UIAlertController(title: NSLocalizedString("No connection", comment: "Title Internet connection error"), message: NSLocalizedString("No internet connection, please go online", comment: "Internet connection error saving/retriving data in Firebase Database"), preferredStyle: .alert) 
        let defaultOkAction = UIAlertAction(title: NSLocalizedString("No internet connection, please go online", comment: "Internet connection error saving/retriving data in Firebase Database"), style: .default, handler: nil) 
        alert.addAction(defaultOkAction) 

        self.present(alert, animated: true, completion: nil) 
       } 
      }) 
     } 
    }) 
} 

次に、あなたはあなたの方法がで呼び出す:私はいくつかのミスを犯してしまった場合

checkIfUserExists(username: text, completionHandler: { (value) in 
    // ... 
}) 
関連する問題