我正在使用 SwiftData 构建一个简单的应用程序。在我的应用程序中,用户可以创建、删除和编辑帖子。编辑时,我希望他们能够点击“保存”来保存更改,或点击“取消”来放弃更改。我使用的方法是禁用自动保存并在保存时调用
modelContext.save()
并在放弃更改时调用 modelContext.rollback()
。所以我的modelContainer
定义如下:
WindowGroup {
ContentView()
.modelContainer(for: [Post.self], isAutosaveEnabled: false)
}
我像这样保存并取消:
PostForm(post: post)
.toolbar {
ToolbarItemGroup(placement: .cancellationAction) {
Button("Cancel") {
if modelContext.hasChanges {
modelContext.rollback()
}
dismiss()
}
}
ToolbarItemGroup(placement: .confirmationAction) {
Button("Save") {
do {
if modelContext.hasChanges {
try modelContext.save()
}
} catch {
fatalError("Failed to save post: \(error.localizedDescription)")
}
callback?()
dismiss()
}
}
}
我面临的问题是,在调用
modelContext.rollback()
之后,我的帖子没有在用户界面中更新,它们仍然显示更改。重新启动应用程序会显示没有更改的帖子,所以我猜测 modelContext.rollback()
实际上是放弃更改,而不是将它们保留在存储中,UI 是不对更改做出反应的 UI。这种做法正确吗?我怎样才能使 modelContext.rollback()
中放弃的更改在 UI 中更新?
我在相关线程上找到了解决方案:如何使 SwiftData @Query 从后台上下文中所做的更改更新?
即使我没有使用后台上下文,此解决方案也有效:
extension MyModel: Identifiable {
var id: String {
"\(persistentModelID) \(property1) \(property2) ..."
}
}
为了使其正常工作,请确保在上面的表示中使用受到影响的模型属性和关系。