为什么保存管理对象上下文更改为isDeleted值?

我正在使用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)
                }
            }
            
        }
        
    }
}

我期望的将会发生:

  1. self.moc.delete(self.item)将删除一个对象,并将 self.item.isDeleted 标记为true。
  2. 尝试self.moc.save 将保存moc
  3. 如果!self.item.isDeleted 将在项目被删除时阻止代码执行(没有此操作,我会得到一个错误:在删除托管对象(...)之后对其进行突变)

它没有用。我在几行上添加了 print(self.item.isDeleted),并在这些行上添加了断点,以检查究竟发生了什么。

这是怎么回事:

  1. self.moc.delete(self.item)删除了一个对象,并将 self.item.isDeleted 标记为true。
  2. 尝试self.moc.save 保存的moc和...
  3. self.item.isDeleted 更改为false
  4. !self.item.isDeleted 不能阻止代码执行,因为isDeleted在此时为假。

是错误吗?还是我不了解Core Data对象和isDeleted更改的生命周期?

iCMS 回答:为什么保存管理对象上下文更改为isDeleted值?

为什么尝试self.moc.save()将self.item.isDeleted从true更改为 假?删除核心数据对象(isDeleted更改后,会发生这种情况 为true),但稍后保存受管对象上下文会将其更改为false。 为什么呢?

它的行为与所记录的一样-在保存之前返回 true ,在其他情况下不会返回

以下是NSManagedObject的Apple文档的快照:

摘要

一个布尔值,指示是否将被管理对象 在下一次保存期间已删除。声明

var isDeleted:布尔{get}讨论

true,如果Core Data将要求持久存储删除对象 在下一次保存操作期间,否则为false。它可能返回false 在其他时间,尤其是在删除对象之后。的 停止返回true的即时性取决于 对象正在删除中。如果接收器有故障, 访问此属性不会导致其触发。

本文链接:https://www.f2er.com/2047814.html

大家都在问