我想在Firestore中删除用户帐户及其所有文档,但是对于异步查询,Firebase会在所有文档之前删除该帐户。
因此我收到一个auth错误,因为当firestorm删除持续文档时,该用户不再存在。
db.collection("users").document(self.user.uid).collection("sachets").getDocuments() { (QuerySnapshot, err) in
if let err = err{
print("Erreur de lecture : \(err)")
} else {
for document in QuerySnapshot!.documents {
db.collection("users").document(self.user.uid).collection("sachets").document(document.documentID).delete(){ err in
if let err = err {
print(" Probleme de suppression des docuemnts \(err)")
} else {
print(" Documents supprimés")
}
}
}
}
}
self.user?.delete { error in
if let error = error {
print(" Probleme de suppression du compte Utilisateur \(error)")
} else {
print(" Utilisateur supprimé")
}
}
有人可以告诉我该怎么办? 谢谢
答案 0 :(得分:1)
好的,我建立了一个测试项目并解决了这个问题。您还需要确保从用户字段中删除所有数据。例如,如果您在name
节点上有age
,user
等。
首先,我创建了一个函数来提取当前用户uid
:
func currentUser() -> String {
return Auth.auth().currentUser!.uid
}
然后,我创建了一个功能,用于删除已登录用户的所有数据。这将首先删除所有子集合数据,然后将删除userID
的文档。
要处理异步方法,您可以使用DispatchGroup
通知所有异步调用何时完成。
旁注:如果不能100%保证有文档,请确保从不强制解开值。否则,您的应用可能会崩溃。要解决此问题,请使用guard
或if let
来解决此问题。
// Where "user" is the result from currentUser()
func removeData(from user: String) {
db.collection("users").document(user).collection("sachets").getDocuments { (snapshot, error) in
if let error = error {
// Handle error
} else if let documents = snapshot?.documents {
// Using if let to see if there are documents
// Time to delete all the subCollection for the user
self.deleteSubCollectionData(for: user, documents, completion: {
// Once that done, make sure to delete all the fields on the highest level.
self.db.collection("users").document(user).delete(completion: { (error) in
if let error = error {
// Handle error
} else {
// Delete the account
self.deleteAccount()
}
})
})
}
}
}
// This function will remove the subCollectionData
fileprivate func deleteSubCollectionData(for user: String, _ documents: [QueryDocumentSnapshot], completion: @escaping () -> ()) {
let group = DispatchGroup()
documents.forEach({
group.enter()
self.db.collection("users").document(user).collection("sachets").document($0.documentID).delete(completion: { (error) in
if let error = error {
// Handle error
}
group.leave()
})
})
// Once the dispatchGroup is done...
group.notify(queue: .main) {
completion()
}
}
最后...
func deleteAccount() {
Auth.auth().currentUser?.delete { (error) in
if let error = error {
print(error)
} else {
print("Deleted account")
}
}
}
如果您不删除所有级别的数据,那么Firestore中仍然会有数据。
答案 1 :(得分:0)
您的getDocuments()
方法是异步的,因此仅应在删除文档后删除帐户。
只需将user?.delete
方法放在getDocuments()
回调中
db.collection("users").document(self.user.uid).collection("sachets").getDocuments() { (QuerySnapshot, err) in
if let err = err{
print("Erreur de lecture : \(err)")
} else {
for document in QuerySnapshot!.documents {
db.collection("users").document(self.user.uid).collection("sachets").document(document.documentID).delete(){ err in
if let err = err {
print(" Problème de suppression des documents \(err)")
} else {
print(" Documents supprimés")
}
}
}
}
self.user?.delete { error in
if let error = error {
print(" Problème de suppression du compte Utilisateur \(error)")
} else {
print(" Utilisateur supprimé")
}
}
}