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])
}
Другие вопросы по тегам