如何/何时在注册和写入数据库后删除Firebase Auth侦听器?



我正在使用 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!)
}

最新更新