swift - 为什么保存被管理对象上下文变化的是Deleted值?

标签 swift core-data swiftui managedobjectcontext

我正在使用 SwiftUI 和 Core Data 编写一个 iOS 应用程序。我对核心数据很陌生,并试图理解一些东西:

为什么 try self.moc.save()self.item.isDeletedtrue 更改为 false ? 它发生在我删除一个 Core Data 对象之后(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. if !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. if !self.item.isDeleted 没有阻止代码执行,因为此时 isDeleted 为 false。

这是一个错误吗?或者我不理解 Core Data 对象的生命周期和 isDeleted 的变化?

最佳答案

Why try self.moc.save() changes self.item.isDeleted from true to false? It happens after I delete a Core Data object (isDeleted changes to true), but later saving managed object context changes it to false. Why is that?

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

这是 NSManagedObject 的 Apple 文档快照:

Summary

A Boolean value that indicates whether the managed object will be deleted during the next save. Declaration

var isDeleted: Bool { get } Discussion

true if Core Data will ask the persistent store to delete the object during the next save operation, otherwise false. It may return false at other times, particularly after the object has been deleted. The immediacy with which it will stop returning true depends on where the object is in the process of being deleted. If the receiver is a fault, accessing this property does not cause it to fire.

关于swift - 为什么保存被管理对象上下文变化的是Deleted值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62604960/

相关文章:

ios - Swift:如何使用 SwiftUI 4 根据侧栏选择状态更改 DetailView?

swift - 当代码块发生变化时如何将其与@State var关联起来

objective-c - 自定义 NSURLProtocol 以显示/隐藏 NetworkActivityIndi​​cator

swift - 由于主键冲突,将对象从一个 Realm 复制到另一个 Realm 失败

ios - 作为一种常用方法,如何将图像作为我应用程序中所有 XIB 的背景?

iPhone 应用程序在 [self.tableView endUpdates] 上崩溃

SwiftUI 禁用列表边框 iOS 14

从 void 函数返回值时,Swift 3 编译器显示错误消息

swift - CoreData 创建并保存具有 nil 属性的额外实体

swift - 关系属性的核心数据获取请求