无法使用 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!")
        }
    }
}

感谢 xTwisteDx and jnpdx 的帮助回答。

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!")
        }
    }
}
}

再次感谢所有线索。