NSArrayController и исключение «CoreData не может выполнить ошибку» - PullRequest
0 голосов
/ 01 сентября 2011

У меня есть список элементов, экземпляры класса Item, сохраненные в модели базовых данных.

Эти элементы отображаются в NSTableView с использованием NSArrayController и Привязки какао . Работает очень хорошо.

Однако, когда я удаляю некоторые элементы, используя следующие инструкции:

// Removes selected items
for (Item *item in self.itemsArrayController.selectedObjects) {
    [self.managedObjectContext deleteObject:item];
}

NSError *error = nil;       
if (![self.managedObjectContext save:&error]) {
    [[NSApplication sharedApplication] presentError:error];
}

через некоторое время , я получаю исключение CoreData не может выполнить ошибку .

Я прочитал всю найденную документацию (включая Устранение неполадок с базовыми данными ), но ничего полезного не нашел.

Я использую новый ARC (автоматический подсчет ссылок), поэтому я почти уверен, что после сохранения в контексте управляемого объекта не пытаюсь получить доступ к управляемому объекту, который был удален.

ОБНОВЛЕНИЕ: Мое приложение является однопоточным, поэтому я не пытаюсь получить доступ к managedObjectContext из нескольких потоков.

Ответы [ 2 ]

1 голос
/ 02 сентября 2011

Вы обращаетесь к одному и тому же managedObjectContext в нескольких потоках? Это похоже на состояние гонки, когда вы удаляете объект, который MOC ожидает вокруг. Доступ к данному NSManagedObjectContext возможен только из одного потока.

0 голосов
/ 13 октября 2011

Вы перечисляете выбранные элементы контроллера массива и удаляете объекты при перечислении.Попробуйте:

NSArray *selectedObjects = [[self.itemsArrayController selectedObjects] copy];
for (Item *item in selectedObjects) {
    [self.managedObjectContext deleteObject:item];
}
[selectedObjects release];
...