ios - 如何解决随处开放的 Firebase 监听器的问题?
问题描述
我有一些简单的应用程序,它有身份验证。最近的代码检查您是否已经输入:
func signingManager(){
Auth.auth().addStateDidChangeListener { [weak self] (auth, user) in
guard let self = self else {return}
if user != nil {
self.showNextVC()
print("You are already entered")
}
}
}
它在您第一次打开应用程序时有效,如果您输入 func "showNextVC" 将打开下一个 VC。同时我有带有代码的登录按钮:
@IBAction func logInTapped(_ sender: UIButton) {
guard let email = emailTextField.text, let password = passwordTextField.text, email != "", password != "" else {
displayWarningLabel(withText: "info is incorrect")
return
}
Auth.auth().signIn(withEmail: email, password: password, completion: { [weak self] (user, error) in
if error != nil {
self?.displayWarningLabel(withText: "error occured")
return
}
if user != nil {
self?.showNextVC()
print("Congratulations, you have successfully logged in!")
}
self?.displayWarningLabel(withText: "no such user")
}
)}
现在关于问题:如果我单击“登录”按钮,首先触发“signingManager ()”方法和它的“showNextVC”,然后才触发“logInTapped”方法本身,然后再次触发“showNextVC”。结果我有2个VC和两条消息:“你已经进入”和“恭喜你成功登录!” 我究竟做错了什么?谢谢!
解决方案
由于您正在侦听身份验证状态更改,因此您不需要self?.showNextVC()
在完成回调中处理signIn(withEmail:, password:)
. 该代码应该只出现在addStateDidChangeListener
.
或者,您可以:
- 使用
addStateDidChangeListener
初始检测用户是否已登录。 - 在状态更改的回调中:
- 通过调用删除监听器
removeAuthStateDidChangeListener
- 启动显式登录流程,并
signIn(withEmail:, password:)
像现在一样调用。
- 通过调用删除监听器
推荐阅读
- angular - patchValue 不适用于 FormArray
- smartcard - ACOSJ 从 apdu.getOffsetCData 给出不正确的结果
- javascript - 使用 Javascript 按类名更改元素的内容
- java - 上传 .ico 文件时 Google App Engine Java 图像服务无法正常工作
- vue.js - Nuxt.js 问题,其中商店状态在 url 更改之前更新
- python - 如何逐渐将一个列表变成另一个列表(2 个列表的笛卡尔积)?
- python-3.x - 组合多个系列并在 Pandas df 中创建一个新系列
- amazon-elastic-beanstalk - 我可以通过 AWS Elastic beanstalk 和 Code Commit 自动部署吗?
- angular - 使用来自 firebase 的 json 格式的数据实现数据表
- javascript - Google Sheets API 随机拒绝访问