@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 )。
然后模拟器显示没有文本的警报消息,但如果我关闭警报并再次点击 loginEmailButton
,signInWithEmail
将正确执行并显示警报正确的消息。我什至尝试更新 Firebase Pod,但问题仍然存在。
有什么建议吗?谢谢!
最佳答案
它的异步问题。 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)
}
})
}
关于ios - Swift - Firebase 函数signInWithEmail 在第一次调用时不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39935800/