2017-10-22 8 views
1

私はユーザ名を取得し、関連するパスワードを見つけるためのログインページのコードを書いています。一時的に私は "電子メールがユーザ名の下に存在すれば、完全なセグー"と言いました。しかし、私が電子メールをチェックするgetEmailメソッドを呼び出すと、完全な電子メールアドレスで正しく終了しないようです。 print(email)は正しいメールアドレスを返すので、私はそれを取得したことを知っており、正しいものです。私は決して方法のそれを作るように見えることはありません。本当にここにこだわった! Heres私のコード:Firebase observeメソッドが返されずに続行しない

func getEmail(name: String) -> String{ 
    var email = "" 
    ref = Database.database().reference() 
    self.ref.child("Users").child(name).observeSingleEvent(of: .value, with: { (snapshot) in 
     if let user = snapshot.value as? [String:Any] { 
      print("email retrieved"); 
      email = user["email"] as! String; 
      print(email) 
      return; 
     } 
     else{ 
      print("email could not be retrieved from the user."); 

     } 
    }){ (error) in 
     print("Could not retrieve object from database because: "); 
     print((Any).self); 
    } 
    return email; 
} 

func validate(){ 
    if(Username.text == ""){ 
     EmptyStringAlert(); 
    } 

    let email = getEmail(name: Username.text!); 
    print(email) 
    if(email == ""){ 
     return; 
    } 
    performSegue(withIdentifier: "LoginSuccess", sender: nil) 
} 
+0

FireBaseのWebCallが非同期であるため、次のように試してください。 'return email;の直前に' print( "返信する電子メール:\(email)" "を実行すると、' print( "取り出された電子メール");がAFTERと呼ばれます。 + Async + Closure "を参考にしてください。 – Larme

答えて

2

Firebaseの呼び出しは非同期なので、データを取得するために関数内で補完を使用する必要があります。

func getEmail(name: String, completion: @escaping (Bool, Any?, Error?) -> Void) { 
    var email = "" 
    ref = Database.database().reference() 
    self.ref.child("Users").child(name).observeSingleEvent(of: .value, with: { (snapshot) in 
      if let user = snapshot.value as? [String:Any] { 
       email = user["email"] as! String 
       completion(true, email, nil) 
      } 
      else { 
       completion(false, nil, nil) 
      } 
    }){ (error) in 
     completion(false, nil, error) 
    } 
} 

func validate(){ 
    if(Username.text == ""){ 
     EmptyStringAlert(); 
    } 

    getEmail(name: Username.text!) { (success, response, error) in 
     guard success, let email = response as? String else { 
      print(error ?? "Failed getEmail..") 
      return 
     } 
     if(email == "") { 
      return 
     } 
     performSegue(withIdentifier: "LoginSuccess", sender: nil) 
    } 
} 
+0

多くの助けがありました!ありがとうございました!補完とブロックの詳細については、私が行くことができるオンラインリソースをご存知ですか? –

関連する問題