我正试图允许用户批量删除一堆文档。如果文件数量不多,但工作量很大(例如1000多个文件),它会删除所有文件然后挂起。如果我关闭然后重新打开该应用程序,则会看到所有文档均已根据需要删除。
我的代码是:
let query = self.collection.whereField("about", isEqualTo: self.about!.uid!).whereField("dataSource", isEqualTo: "appleHealth")
query.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
document.reference.delete()
}
}
}
我也尝试在后台队列中运行它,但是存在相同的问题。它显示“这是在外部队列中的先前代码之后,在主队列上运行”,但应用程序随后才挂起:
DispatchQueue.global(qos: .background).async {
print("This is run on the background queue")
let query = self.collection.whereField("about", isEqualTo: self.about!.uid!).whereField("dataSource", isEqualTo: "appleHealth")
query.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
document.reference.delete()
}
}
}
DispatchQueue.main.async {
print("This is run on the main queue, after the previous code in outer block")
}
}
有没有理由在大规模删除一堆文件后挂起,但在较小的文件集上可以正常工作?
答案 0 :(得分:0)
如果要删除大型节点,则可以考虑使用CLI工具,特别是'database:remove'。请在此处查看官方参考: https://firebase.google.com/docs/cli?hl=en#rtdb-commands
前一段时间,根据Firebase的支持,“ database:remove”命令会通过将数据库节点分成多个块来删除数据库节点,从而防止数据库实例被锁定。