2016-10-08 2 views
2
@IBAction func loginEmailButton(sender: AnyObject) { 
     FIRAuth.auth()?.signInWithEmail(email.text!, password: password.text!, completion: { (user, error) in 
      if error != nil { 
       if let errCode = FIRAuthErrorCode(rawValue: error!.code) { 
        switch errCode { 
        case .ErrorCodeInvalidEmail: 
         self.emailLoginStatus = "invalid email" 
        case .ErrorCodeUserDisabled: 
         self.emailLoginStatus = "User account disabled" 
        case .ErrorCodeWrongPassword: 
         self.emailLoginStatus = "Wrong Password" 
        case .ErrorCodeUserNotFound: 
         self.emailLoginStatus = "User not found" 
        case .ErrorCodeNetworkError: 
         self.emailLoginStatus = "Could not connect" 
        default: 
         self.emailLoginStatus = "Login Error" 
        } 
       } 
      }else{ 
       self.emailLoginStatus = "Logged" 
      } 
     }) 

     if self.emailLoginStatus == "Logged"{ 
      self.performSegueWithIdentifier("emailLoginToSearchSegue", sender: self) 
     }else{ 
      showAlert(emailLoginStatus) 
     } 

} 

私はステップによって、コードのステップをデバッグでしたし、これが状況であるには実行されません。私は初めてloginEmailButtonをタップすると、メールアドレスとパスワードのパラメータが設定されていますsignInWithEmail関数への呼び出しを行いますが、この関数は実行されません(デバッグ時の次のステップは、完了ブロックを実行しないで直接関数から外します)。スウィフト - Firebase関数signInWithEmail最初の呼び出し

次に、シミュレータにテキストなしの警告メッセージが表示されますが、警告を閉じてloginEmailButtonを再度タップすると、signInWithEmailが正しく実行され、正しいメッセージで警告が表示されます。私はFirebaseのポッドを更新しようとしても、まだ問題は残っています。

提案がありますか?ありがとう!

答えて

2

その非同期の問題。 signInWithEmailは、この呼び出しが完了するまでに時間がかかるが、performSegueWithIdentifierはcompletionBlockの外に置かれているため、サインインが完了するまで実行されるため、この呼び出しは別のネットワークスレッドにロードされるという意味ですあなたは次の時間をあなたのボタンを押したときに、それはseguesので、しかし、あなたのユーザーは、以前)(

ちょうど signInWithEmail completionBlock内

self.performSegueWithIdentifier("emailLoginToSearchSegue", sender: self) 

を入れて...、あなたの最初の呼び出しから署名されていました。

@IBAction func loginEmailButton(sender: AnyObject) { 
    FIRAuth.auth()?.signInWithEmail(email.text!, password: password.text!, completion: { (user, error) in 
     if error != nil { 
      if let errCode = FIRAuthErrorCode(rawValue: error!.code) { 
       switch errCode { 
       case .ErrorCodeInvalidEmail: 
        self.emailLoginStatus = "invalid email" 
       case .ErrorCodeUserDisabled: 
        self.emailLoginStatus = "User account disabled" 
       case .ErrorCodeWrongPassword: 
        self.emailLoginStatus = "Wrong Password" 
       case .ErrorCodeUserNotFound: 
        self.emailLoginStatus = "User not found" 
       case .ErrorCodeNetworkError: 
        self.emailLoginStatus = "Could not connect" 
       default: 
        self.emailLoginStatus = "Login Error" 
       } 
      } 
     }else{ 
      self.performSegueWithIdentifier("emailLoginToSearchSegue", sender: self) 
     } 
    }) 
} 
+0

それはあなたの問題を解決した場合:)ハッピー – Dravidian

+0

ドラヴィダコーディング、あなたの答えは、理にかなって、ありがとうございました、しかし、私は成功せず前にそれをしようとした答えとして(私の答えの左上の目盛り)、これを受け入れます。 performSegueWithIdentifierをsignInWithEmail関数の中に置き、Loginボタンをタップすると、segueはsignInWithEmailエラーの検証なしでトリガされます。これは、最初の呼び出しでsignInWithEmail関数がまだ実行されておらず、この関数がperformSegueWithIdentifierを隠しているために発生します。 – Enzo

+0

もしerr == nilならば、なぜエラー確認が必要でしょうか? – Dravidian

関連する問題