我的代码如下。数据中的名字没有改变,但是有变化总是返回true,是不是我做错了什么?非常感谢您的帮助!
struct SwiftUI: View {
@Environment(.managedObjectContext) var moc
@Environment(.presentationMode) var pre: Binding<PresentationMode>
var data: CoreData
@State private var name = ""
var body: some View {
NavigationView {
HStack {
TextField("name", text: self.$name)
}.onAppear{
self.name = self.data.name ?? ""
}
Button(action: dataSave) {
HStack {
Text("Done")
}
}
}
}
func dataSave() {
self.data.name = self.name
if moc.hasChanges {
do {
try moc.save()
self.pre.wrappedValue.dismiss()
} catch { print(error.localizedDescription) }
} else {
self.pre.wrappedValue.dismiss()
}
}
}
为什么这里总是返回 true?
moc.hasChanges
当您在该上下文中分配给对象的任何属性时,NSManagedObjectContext.hasChanges
设置为 true,即使该属性的值与以前相同。
您可以更改代码以执行:
if self.name != self.data.name {
self.data.name = self.name
}
if moc.hasChanges { /* ... */ }
或者,检查对象本身(而不是上下文(的hasPersistentChangedValues
:
self.data.name = self.name
if self.data.hasPersistentChangedValues {
do {
try moc.save()
self.pre.wrappedValue.dismiss()
} catch { print(error.localizedDescription) }
} else {
self.pre.wrappedValue.dismiss()
}
}
不幸的是,NSManagedObjectContext
没有同等的hasPersistentChangedValues
属性。第二种方法仅在您的示例中是合理的,而不是一般情况,在一般情况下,上下文中可能有许多对象可能已更改。
有关hasChanges
和hasPersistentChangedValues
行为的更多信息,请参阅此答案:NSManagedObject 的 hasChanges 为真,而 changedValues 为空