Swift - 线程 1:EXC_BAD_INSTRUCTION 从 Coredata 中删除对象时

Swift - Thread 1: EXC_BAD_INSTRUCTION when deleting object from Coredata

我正在尝试从 Coredata 中删除一个对象,有时我会收到错误 Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0),当我删除一个对象时,我的应用程序崩溃了。控制台还会输出大量信息,但这似乎是最重要的事情:

[General] *** __boundsFail: index 2 beyond bounds [0 .. 1]

奇怪的是,只有当我调用从警报中删除对象的函数时才会发生这种情况。

这是删除对象的函数:

    private func deleteInstances(offsets: IndexSet) {
        if instances.count == 1 {
            showingCantDeleteInstanceAlert = true
            return
        }
        
        for index in offsets {
            let instance = instances[index]
            print(instance)
            viewContext.delete(instance)
        }
        
        do {
            try viewContext.save()
        } catch {
            let nsError = error as NSError
            fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
        }

        if selectedInstanceIndex ?? 0 >= instances.count {
            selectedInstanceIndex = instances.count - 1
        }
        
    }

我正在使用 focusedValue 从菜单命令调用该函数:

.focusedValue(\.deleteInstanceAction) {
    deleteInstances(offsets: [selectedInstanceIndex ?? 0])//selectedInstanceIndex is the index of the object that is selected in a navigationView and therefore the object I want to delete
}

这总是工作正常,但我希望它显示一个警报,确保用户确实想要删除实例:

.focusedValue(\.deleteInstanceAction) {
    showingConfirmDeleteInstanceAlert = true

和警报:

.alert(isPresented: $showingConfirmDeleteInstanceAlert) {
    Alert(
        title: Text("Are you sure you want to delete instance \"\(instances[selectedInstanceIndex ?? 0].wrappedName)\"?"),
        message: Text("This action cannot be undone."),
        primaryButton: .cancel(),
        secondaryButton: .destructive(Text("Delete")) {
            deleteInstances(offsets: [selectedInstanceIndex ?? 0])
        }
    )
}

但是,当函数从此处改为 运行 时,我有时会收到该错误。只有当我尝试删除导航视图中的最后一个实例时才会发生。

我对可能发生的事情感到茫然,据我所知,相同的代码应该是 运行 两种方式,但在带有警报的版本中它并不总是有效。

如果您能帮助我们弄清楚发生了什么,我们将不胜感激。 谢谢!

尝试使用实例的 managedObjectContext,例如:

let context = instance.managedObjectContext
context.delete(instance)

do {
    try context.save()
} catch {
    let nsError = error as NSError
    fatalError("Unresolved error \(nsError),  \(nsError.userInfo)")
}

如果这不起作用,请尝试将对函数的调用推送到主线程,这不是最好的,但您正在使用 viewContext,所以您必须在“UI Thread" 或主线程。所以像:

DispatchQueue.main.async {
    deleteInstances(offsets: [selectedInstanceIndex ?? 0])
}