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])
}
我正在尝试从 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])
}