Основанное на NSFetchedResultsController Табличное представление всегда перестало работать на ВТОРОЙ вставке объекта

Я использую NSFetchedResultsController для управления, отображение выбрало управляемые объекты в табличном представлении, которое имеет один раздел. Таблица начинается пустой, и пользователь может добавить новые объекты к ней с помощью UI. В настоящий момент программа всегда работает при добавлении первого объекта и всегда отказывает при добавлении секунды. Иногда нет никакой ошибки, представленной на катастрофический отказ и другие времена, там ошибки отличающихся типов (некоторые включенные ниже). Через операторы журнала и трассировку я вижу, что программа отказывает сразу после controllerWillChangeContent делегата NSFetchResultsController (который звонит [self.tableView beginUpdates] ;) выходы метода, но прежде чем любой другой метод в моем коде называют. Вот некоторые соответствующие части моего кода. Конфигурирование NSFetchedResultsController:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Beer"
                                    inManagedObjectContext:self.managedObjectContext]];

// Configure request's entity and predicate
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptor release];
[sortDescriptors release];

NSString *expression = [NSString stringWithFormat:@"brewery.name LIKE \"%@\"", self.brewery.name];
NSPredicate *predicate = [NSPredicate predicateWithFormat:expression];
[fetchRequest setPredicate:predicate];
self.resultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                             managedObjectContext:self.managedObjectContext
                                                               sectionNameKeyPath:nil
                                                                        cacheName:nil];
self.resultsController.delegate = self;
[fetchRequest release];

NSError *error = nil;
BOOL success = [resultsController performFetch:&error];
if (!success) {
    NSLog(@"Error fetching request %@", [error localizedDescription]);
}

Добавление нового объекта:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Beer" inManagedObjectContext:self.managedObjectContext];
Beer *beer = [[Beer alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];
beer.name = beerName;
beer.brewery = self.brewery;

Я видел предупреждения в документах о проблемных таблицах отображения с одним разделом, и я использовал обходное решение Apple для этого напрасно. Те методы не становятся названными до катастрофического отказа так или иначе.

Некоторые ошибки я получил:

Serious application error.  Exception was caught during Core Data change processing: *** -[NSCFString compareObject:toObject:]: unrecognized selector sent to instance 0x4e808c0 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[CALayer compareObject:toObject:]: unrecognized selector sent to instance 0x4e53b80 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[UITextTapRecognizer controllerWillChangeContent:]: unrecognized selector sent to instance 0x4ca5d70 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[CALayer controllerWillChangeContent:]: unrecognized selector sent to instance 0x4e271a0 with userInfo (null)
Serious application error.  Exception was caught during Core Data change processing: *** -[NSCFNumber countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x4c96ee0 with userInfo (null)

Как Вы видите, ошибки (когда каждый был представлен), не последовательны, даже когда никакое изменение в коде не было внесено.

Кто-либо может выяснить то, что я делаю неправильно?

5
задан Drew C 11 February 2010 в 03:13
поделиться

3 ответа

Непоследовательные ошибки указывают на возможную проблему чрезмерного выпуска. Тем более, что смена делегатов на просто перезагрузку данных приводит к тому, что проблема исчезает. Лично я бы потратил время на решение проблемы, а не на кодирование вокруг нее, так как у вас определенно есть проблема с кодом, которая, вероятно, появится позже где-то еще.

Я бы сделал следующее:

  1. Включите NSZombie
  2. Добавьте точку останова для objc_exception_throw
  3. Запустите в отладчике

При возникновении исключения посмотрите на адрес памяти и посмотрите, к чему осуществляется доступ и где. Это изолирует проблему и расскажет вам, что происходит. Было бы также полезно, если это не раскрывает проблему, опубликовать ваши делегированные методы NSFetchedResultsController, чтобы я мог увидеть, есть ли в них что-то странное.

Лучше всего обновить исходный вопрос дополнительной информацией.

4
ответ дан 14 December 2019 в 08:49
поделиться

Ваш код для создания новых сущностей выглядит странно. Что если вместо этого использовать вот это:

Beer* beer = [NSEntityDescription insertNewObjectForEntityForName: @"Beer" 
    inManagedObjectContext: self.managedObjectContext];
beer.name = @"Grolsch";

Также, вы не вызываете NSManagedObjectContext#save:. Но, возможно, вы делаете это в части вашего кода, которую вы сейчас показали?

1
ответ дан 14 December 2019 в 08:49
поделиться

Хотя я не решил эту конкретную проблему, я применил несколько иной подход к написанию класса, который давал нужную мне функциональность и не вызывал проблемы возникать. Я все еще использую NSFetchedResultsController, но вместо реализации всех четырех методов делегата я реализую только controllerDidChangeContent :, который просто вызывает [tableView reloadData].

Это реализация, которая включается в класс RootViewController, если вы создаете новое приложение на основе навигации в XCode, которое использует базовые данные для хранения. Вы, вероятно, потеряете некоторый контроль над анимацией редактирования таблицы, но это намного проще и отлично подходит для моих целей.

1
ответ дан 14 December 2019 в 08:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: