无法使用 SwiftUI 从 Firebase / Firestore 中删除文档
Unable to remove documents from Firebase / Firestore, using SwiftUI
伙计们。
我在 SwiftUI (MVVM) 中创建了一个应用程序,能够在 Firebase / Firestore 中包含和更新文档。但是,我无法从 Firestore 中删除这些文档。使用下面介绍的方法,我可以从列表中删除一行。但是,该行在视图更新后重新出现,因为它尚未从 firestore 中删除。
有人能告诉我下面的代码有什么问题吗?我相信我没有通过函数正确传递 documentID。
提前致谢。
下面我介绍与 onDelete 和函数 deleteItem 相关的代码,取自 ContentView、FileModel、FileViewModel 和 FileRepository(Firestore)。
在内容视图中:
@ObservedObject var fileViewModel: FileViewModel
var body: some View {
VStack {
List{
ForEach (fileViewModel.fileModel) { data in
VStack {
Text(data.itemOne)
Text(data.itemTwo)
}
}.onDelete(perform: {_ in self.fileViewModel.deleteItem()})
}
}
}
在文件模型中:
@DocumentID var id: String?
var itemOne: String
var itemTwo: String
在 FileViewModel 中:
func deleteItem() {
FileRepository.deleteItem()
}
在文件存储库中:
func deleteItem() {
db.collection("fileModel").document("id").delete() { err in
if let err = err {
print("Error removing document: \(err)")
} else {
print("Document successfully removed!")
}
}
}
如jnpdx, and as I was guessing, I needed to pass the item index into onDelete. But for that, it was necessary to create a new ViewModel (rowViewModel), and instantiate it inside fileViewModel, as in the approach presented by Peter Friese所述。
在我的例子中,代码如下所示。
在内容视图中:
List{
ForEach (fileViewModel.rowViewModel) { data in
VStack {
Text(data.itemOne)
Text(data.itemTwo)
}
}.onDelete { indexSet in self.fileViewModel.deleteItem(atOffsets: indexSet)}
在FileModel中:同上。
在 FileViewModel 中:
func deleteItem(atOffsets indexSet: IndexSet) {
let viewModels = indexSet.lazy.map { self.rowViewModel[[=11=]] }
viewModels.forEach { rowViewModel in
fileRepository.removeItem(rowViewModel.row) }
}
在文件存储库中:
func removeItem(_ fileModel: FileModel) {
if let fileModelID = fileModel.id {
db.collection("fileModels").document(fileModelID).delete() { err in
if let err = err {
print("Error removing document: \(err)")
} else {
print("Document successfully removed!")
}
}
}
}
再次感谢所有线索。
伙计们。 我在 SwiftUI (MVVM) 中创建了一个应用程序,能够在 Firebase / Firestore 中包含和更新文档。但是,我无法从 Firestore 中删除这些文档。使用下面介绍的方法,我可以从列表中删除一行。但是,该行在视图更新后重新出现,因为它尚未从 firestore 中删除。 有人能告诉我下面的代码有什么问题吗?我相信我没有通过函数正确传递 documentID。 提前致谢。
下面我介绍与 onDelete 和函数 deleteItem 相关的代码,取自 ContentView、FileModel、FileViewModel 和 FileRepository(Firestore)。
在内容视图中:
@ObservedObject var fileViewModel: FileViewModel
var body: some View {
VStack {
List{
ForEach (fileViewModel.fileModel) { data in
VStack {
Text(data.itemOne)
Text(data.itemTwo)
}
}.onDelete(perform: {_ in self.fileViewModel.deleteItem()})
}
}
}
在文件模型中:
@DocumentID var id: String?
var itemOne: String
var itemTwo: String
在 FileViewModel 中:
func deleteItem() {
FileRepository.deleteItem()
}
在文件存储库中:
func deleteItem() {
db.collection("fileModel").document("id").delete() { err in
if let err = err {
print("Error removing document: \(err)")
} else {
print("Document successfully removed!")
}
}
}
如jnpdx, and as I was guessing, I needed to pass the item index into onDelete. But for that, it was necessary to create a new ViewModel (rowViewModel), and instantiate it inside fileViewModel, as in the approach presented by Peter Friese所述。
在我的例子中,代码如下所示。
在内容视图中:
List{
ForEach (fileViewModel.rowViewModel) { data in
VStack {
Text(data.itemOne)
Text(data.itemTwo)
}
}.onDelete { indexSet in self.fileViewModel.deleteItem(atOffsets: indexSet)}
在FileModel中:同上。
在 FileViewModel 中:
func deleteItem(atOffsets indexSet: IndexSet) {
let viewModels = indexSet.lazy.map { self.rowViewModel[[=11=]] }
viewModels.forEach { rowViewModel in
fileRepository.removeItem(rowViewModel.row) }
}
在文件存储库中:
func removeItem(_ fileModel: FileModel) {
if let fileModelID = fileModel.id {
db.collection("fileModels").document(fileModelID).delete() { err in
if let err = err {
print("Error removing document: \(err)")
} else {
print("Document successfully removed!")
}
}
}
}
再次感谢所有线索。