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

标签 ios swift firebase firebase-authentication completion

@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函数,但该函数不执行(调试的下一步直接退出函数而不运行完成 block )。

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

有什么建议吗?谢谢!

最佳答案

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

只需输入

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

signInWithEmailcompletionBlock()内。

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

关于ios - Swift - Firebase 函数signInWithEmail 在第一次调用时不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39935800/

相关文章:

iphone - 如果可用,释放 UIViewController

ios - UIDatePicker 泄漏

ios - 制作一个应用程序,我想让照片可选,但在制作新帖子时需要标题

swift - AVAudioPCMBuffer 作为 Base64

javascript - 更改默认的 firebase 存储桶?

ios - 批量/多个 iOS 推送通知代码 - 适用于 2 台设备,但不适用于 100 台设备

ios - 核心数据 unsigned long long 最佳实践

iOS 8 Swift - 保存多个实体的数据

firebase - 使用 Firebase 和 Electron 管理 session Cookie

firebase - "firebase serve"只是一个计划 Vanilla 开发服务器吗?