我正在使用 Firebase 电子邮件/密码身份验证,并将用户名和其他信息写入我的数据库。要写入数据库,我正在使用文档中建议的身份验证侦听器:
handle = Auth.auth().addStateDidChangeListener { (auth, user) in
// ...
}
我遇到的问题是,当我注销用户,然后重新登录侦听器时,再次触发并覆盖我的数据库信息。所以我试图弄清楚如何在第一次触发后删除侦听器。
我尝试使用以下命令删除侦听器:
Auth.auth().removeStateDidChangeListener(listener)
但这会在侦听器有时间写入我的数据库之前将其删除。
这可能很简单,但是我怎样才能编写它以延迟删除侦听器,直到它触发第一次写入数据库之后?
我已经在几个地方尝试过,并且我寻找了一些替代方案,但我还没有看到任何解决此问题的方法,这让我感到惊讶,因为这似乎是一种非常普遍的情况。
以下是我用于创建帐户并写入数据库的代码:
@IBAction func nextButtonTapped(_ sender: UIButton) {
validate()
if usernameTakenLabel.isHidden == false {
nextButton.isEnabled = false
}
// Create Account w/ email
let usersRef = Database.database().reference().child("users")
let usernamesRef =
Database.database().reference().child("usernameRef")
if username != "" && email != "" && password != "" {
Auth.auth().createUser(withEmail: emailTextfield.text!, password: passwordTextfield.text!) { (user, error) in
print("New User successfully created")
}
self.listener = Auth.auth().addStateDidChangeListener { (auth, user) in
if let user = user {
//Write username to the database
usersRef.child(user.uid).setValue(["username": username])
usernamesRef.childByAutoId().setValue(username)
print("username successfully created")
}
}
//PROBLEM:
//How can I delay this until after the code above runs?
Auth.auth().removeStateDidChangeListener(listener!)
}
}
任何和所有的帮助非常感谢!
你需要添加一个完成块,每当任务完成时,我们就可以调用进一步的方法。
func checkUser(completion:() -> Void)
{
// Create Account w/ email
let usersRef = Database.database().reference().child("users")
let usernamesRef =
Database.database().reference().child("usernameRef")
if username != "" && email != "" && password != "" {
Auth.auth().createUser(withEmail: emailTextfield.text!, password: passwordTextfield.text!) { (user, error) in
print("New User successfully created")
}
self.listener = Auth.auth().addStateDidChangeListener { (auth, user) in
if let user = user {
//Write username to the database
usersRef.child(user.uid).setValue(["username": username])
usernamesRef.childByAutoId().setValue(username)
print("username successfully created")
//call this whenever the the task is completed
completion()
}
}
//you can also call this function here
//Auth.auth().removeStateDidChangeListener(listener!)
}
}
checkUser
{
print("task Completed")
Auth.auth().removeStateDidChangeListener(listener!)
}