Swift - Тема 1: EXC_BAD_INSTRUCTION при удалении объекта из 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
}
}
И я использую FocusValue для вызова этой функции из команды меню:
.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])
}
)
}
Однако, когда функция запускается отсюда, я иногда получаю эту ошибку. Это происходит только тогда, когда я пытаюсь удалить последний экземпляр в navigationView.
Я не понимаю, что может происходить, насколько я могу судить, один и тот же код должен запускаться в любом случае, но в версии с предупреждением это не всегда работает.
Любая помощь в выяснении того, что происходит, будет принята с благодарностью. Спасибо!
1 ответ
Попробуйте использовать 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
поэтому вы должны быть в «потоке пользовательского интерфейса» или в основном потоке. так что-то вроде:
DispatchQueue.main.async {
deleteInstances(offsets: [selectedInstanceIndex ?? 0])
}