我正在使用 SwiftUI 和 Core Data 编写一个 iOS 应用程序。我对 Core Data 很陌生,并试图理解一些东西:
为什么尝试 self.moc.save()将self.item.isDeleted从true更改为false?它发生在我删除核心数据对象(isDeleted 更改为 true)之后,但稍后保存托管对象上下文将其更改为 false。这是为什么?
这是一个例子:
内容视图.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
- if !self.item.isDeleted如果项目被删除,将阻止代码执行(没有这个,我得到一个错误:Mutating a managed object (...) after it has been removed)
它没有用。我在几行上添加了print(self.item.isDeleted)并在这些行上添加了断点,以检查到底发生了什么。
发生的事情是这样的:
- self.moc.delete(self.item)删除了一个对象并将self.item.isDeleted标记为 true。
- 尝试 self.moc.save保存的 moc 和...
- self.item.isDeleted更改为 false
- if !self.item.isDeleted没有阻止代码执行,因为此时 isDeleted 为 false。
它是一个错误吗?或者我不理解 Core Data 对象的生命周期和 isDeleted 的变化?