【发布时间】:2020-10-25 22:31:58
【问题描述】:
我在我的 iOS 应用项目中使用 Firestore,我想向用户添加一些额外的数据,所以我创建了一个名为“配置文件”的集合,我希望每个文档都命名为 Auth.auth().currentUser.uid,所以我以后可以为每个用户检索数据(或者有更好的方法吗?)。
Firestore 中的这些文档是在用户注册新帐户时创建的:
func createUser() {
db.collection("profiles").document("\(currentUser?.uid)").setData([
"name": name,
"surname": surname,
"email": email,
"shelter": isMember == true ? shelters[selectedShelter] : shelters[0],
"photoURL": imageURL ?? "",
"reputation": 0,
"uuid": "\(uuid)"
])
{ err in
if let error = err {
print("Error ading document: \(error)")
} else {
print("Document added")
}
}
}
但是,此时调用此函数(单击“注册”按钮时),currentUser 不存在,因为它被定义为Auth.auth().currentUser,所以@ 987654327@ = nil 在 Firestore 中的“个人资料”文档中。
函数 createUser 在我的 Register 函数中被调用:
func register() {
if self.email != "" {
if self.pass == self.repass {
Auth.auth().createUser(withEmail: self.email, password: self.pass) { (res, err) in
if err != nil {
self.error = err!.localizedDescription
self.alert.toggle()
return
}
// Success registering a new user
viewRouter.currentView = "Home"
DispatchQueue.main.async {
self.createUser()
}
}
}
else {
self.error = "Les mots de passe ne correspondent pas"
self.alert.toggle()
}
}
else {
self.error = "Veuillez remplir tous les champs"
self.alert.toggle()
}
}
我想过在调用 createUser 函数之前等待 Auth.auth().currentUser 存在。我尝试使用DispatchQueue.main.async 没有成功。
有什么想法吗?或者也许是实现我的目标的更好方法 - 即为每个用户添加更多数据(例如:声誉、庇护所......)?
感谢您的帮助!
【问题讨论】:
-
对不起,我误解了自己,我想要的是在 Auth.auth().currentUser 存在之后调用 createUser,而不是在调用 createUser 之后调用。我已经更新了主帖。
-
那么,您的代码看起来很棒。您在
Auth.auth().createUser的完成处理程序中调用self.createUser。 -
删除
DispatchQueue.main.async {,因为它不需要。除此之外,您的代码很好。创建 Firebase 用户后,它会自动登录,您可以直接在该函数中或在self.createUser()中访问该用户对象,所以......有什么问题?见access user info。哦,this question 也有很好的答案。
标签: ios swift firebase google-cloud-firestore firebase-authentication