Swift - Firebase 函数 signInWithEmail 不在第一次调用时执行

Swift - Firebase function signInWithEmail don't execute in the first call

@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函数,但是这个函数不执行(调试的下一步直接退出函数,没有 运行 完成块)。

然后模拟器显示没有文本的警报消息,但如果我关闭警报并再次点击 loginEmailButtonsignInWithEmail 会正确执行并显示带有正确消息的警报。我什至尝试更新 Firebase pods 但问题仍然存在。

有什么建议吗?谢谢!

它的异步问题。 signInWithEmail 对服务器进行异步调用,这意味着此调用将加载到不同的网络线程中,这需要一些时间才能完成,但是由于您的 performSegueWithIdentifier被放在 completionBlock 之外,所以它甚至在登录完成之前就被执行了,但是当你下次按下你的按钮时,你的用户之前已经从你的第一次通话中登录了,所以它继续......

只要把

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

signInWithEmail completionBlock() 中。

@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)
        }
    })
}