无法使用 SwiftUI 从 Firebase / Firestore 中删除文档
Posted
技术标签:
【中文标题】无法使用 SwiftUI 从 Firebase / Firestore 中删除文档【英文标题】:Unable to remove documents from Firebase / Firestore, using SwiftUI 【发布时间】:2021-07-19 14:47:38 【问题描述】:伙计们。 我在 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!")
【问题讨论】:
您是否收到打印的控制台消息Document successfully removed!
,如果是,那是因为您还没有从本地副本中删除data.<someItem>
。在成功删除它的地方,您需要确保更新您的 data
项目。
另外,您可以打开 Firebase Firestore 并实时观看它是否真的被删除了。我怀疑是这样,你只是没有在本地更新。
您真的只有一份带有id
"id"
的文档吗?这就是deleteItem
中被删除的所有内容。此外,令我惊讶的是,您不会在 onDelete
中传递项目的索引,尽管我认为如果只有一个文档,这是有道理的。
【参考方案1】:
感谢xTwisteDx 和jnpdx 的帮助解答。
正如jnpdx 所提到的,正如我所猜测的,我需要将项目索引传递给onDelete。但为此,有必要创建一个新的 ViewModel (rowViewModel),并在 fileViewModel 中对其进行实例化,就像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[$0]
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 从 Firebase / Firestore 中删除文档的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI 将数据从 Firebase 加载到 TextView
SwiftUI:Firebase ForEach 列表执行编辑功能无法编辑选定的行项目
如何使用 SwiftUI 更新 Firebase 中的集合?