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
函数,但是这个函数不执行(调试的下一步直接退出函数,没有 运行 完成块)。
然后模拟器显示没有文本的警报消息,但如果我关闭警报并再次点击 loginEmailButton
,signInWithEmail
会正确执行并显示带有正确消息的警报。我什至尝试更新 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)
}
})
}
@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
函数,但是这个函数不执行(调试的下一步直接退出函数,没有 运行 完成块)。
然后模拟器显示没有文本的警报消息,但如果我关闭警报并再次点击 loginEmailButton
,signInWithEmail
会正确执行并显示带有正确消息的警报。我什至尝试更新 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)
}
})
}