我正在使用SwiftUI和Core Data编写一个iOS应用程序。我是Core Data的新手,请尝试了解以下内容:
为什么尝试self.moc.save()将 self.item.isDeleted 从 true 更改为 false ? 在删除核心数据对象(isDeleted更改为true)之后,但后来保存托管对象上下文将其更改为false时,会发生这种情况。为什么呢?
这里是一个例子:
ContentView.swift
import SwiftUI
struct ContentView: View {
@Environment(\.managedobjectcontext) var moc
var fetchRequest: FetchRequest<Item>
var items: FetchedResults<Item> { fetchRequest.wrappedValue }
var body: some View {
NavigationView {
List {
ForEach(items,id: \.self) {item in
NavigationLink(destination: DetailsView(item: item)) {
Text("\(item.name ?? "default item name")")
}
}
}
.navigationBarTitle("Items")
.navigationBarItems(
leading:
Button(action: {
for number in 1...3 {
let item = Item(context: self.moc)
item.date = Date()
item.name = "Item \(number)"
do {
try self.moc.save()
}catch{
print(error)
}
}
}) {
Text("Add 3 items")
}
)
}
}
init() {
fetchRequest = FetchRequest<Item>(entity: Item.entity(),sortDescriptors: [
NSSortDescriptor(keyPath: \Item.name,ascending: true)
])
}
}
DetailsView.swift
import SwiftUI
struct DetailsView: View {
@Environment(\.managedobjectcontext) var moc
@Environment(\.presentationmode) var presentationmode: Binding<Presentationmode>
var item: Item
var body: some View {
VStack {
Text("\(item.name ?? "default item name")")
}
.navigationBarItems(
trailing:
Button(action: {
self.moc.delete(self.item)
print(self.item.isDeleted)
self.presentationmode.wrappedValue.dismiss()
print(self.item.isDeleted)
do {
try self.moc.save()
print(self.item.isDeleted)
}catch{
print(error)
}
}) {
Text("Delete")
.foregroundColor(.red)
}
)
.onDisappear {
print(self.item.isDeleted)
if !self.item.isDeleted {
print(self.item.isDeleted)
self.item.name = "new name"
print(self.item.isDeleted)
do {
try self.moc.save()
}catch{
print(error)
}
}
}
}
}
我期望的将会发生:
- self.moc.delete(self.item)将删除一个对象,并将 self.item.isDeleted 标记为true。
- 尝试self.moc.save 将保存moc
- 如果!self.item.isDeleted 将在项目被删除时阻止代码执行(没有此操作,我会得到一个错误:在删除托管对象(...)之后对其进行突变)
它没有用。我在几行上添加了 print(self.item.isDeleted),并在这些行上添加了断点,以检查究竟发生了什么。
这是怎么回事:
- self.moc.delete(self.item)删除了一个对象,并将 self.item.isDeleted 标记为true。
- 尝试self.moc.save 保存的moc和...
- self.item.isDeleted 更改为false
- !self.item.isDeleted 不能阻止代码执行,因为isDeleted在此时为假。
是错误吗?还是我不了解Core Data对象和isDeleted更改的生命周期?