NSFetchedResultsController случайно завершает работу с NSInvalidArgumentException - PullRequest
0 голосов
/ 05 сентября 2011

У меня есть приложение для iOS, которое использует Core Data для временного хранения некоторых данных, загруженных через Интернет, в базу данных.Эти данные используются для заполнения UITableView через NSFetchedResultsController.Вот код (помещенный в UIViewController), который генерирует контроллер:

- (NSFetchedResultsController *)fetchedResultsController {

if (fetchedResultsController != nil) {
    return fetchedResultsController;
}

// Fetch results from database
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Order" inManagedObjectContext:[self.appDelegate ordersObjectContext]];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"patronName" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

// Prefetch size: tweak this to improve performance
[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self.appDelegate ordersObjectContext] sectionNameKeyPath:@"patronNameInitial" cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
fetchedResultsController.delegate = self;

[entity release];
[sort release];
[fetchRequest release];
[theFetchedResultsController release];

return fetchedResultsController;    

}

В рабочем процессе моего приложения необходимо выгрузить табличное представление, в которое упакован этот контроллер, изагружается несколько раз, и тут возникает проблема.Как только контекст заполняется моими сущностями «Порядок», если я переключаюсь назад и вперед к представлению с помощью контроллера результатов, после нескольких нажатий и выталкиваний из стека представлений происходит сбой приложения со следующей ошибкой:

Fatal error. NSInvalidArgumentException. Entity name must not be nil.. User info: (null)

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

Но как это возможно, если контекст моего объекта за это время не изменится?Почему (пример) он работает 5 раз в шестой раз, когда я получаю эту ошибку?

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

Может быть, проблема в том, что я на самом деле не сохраняю «Заказы» в базе данных, а храню их в памяти, в контексте объекта?Я делаю это потому, что, когда приложение останавливается, загруженные данные должны быть стерты.

РЕДАКТИРОВАТЬ 1: Я попытался записать строку прямо перед тем, как происходит сбой, и

NSLog(@"%@", [[self.appDelegate managedObjectModel] entities]);

Вызывает сбой приложения с помощью EXC_BAD_ACCESS, поэтому проблема происходит в managedObjectModel.

РЕДАКТИРОВАТЬ 2: Я попытался заполнить контекст более чем 1500 сущностями, и япосле загрузки и выгрузки вида 30 раз у меня не было сбоев.Кажется, я получаю сбои только тогда, когда контекст управляемого объекта содержит только несколько объектов!Это так странно.

Ответы [ 2 ]

3 голосов
/ 06 сентября 2011

Вы не должны освобождать сущность

[entity release];

Поскольку вы никогда не вызывали на нем alloc, вы не владеете ею.

0 голосов
/ 06 сентября 2011

Я заметил, что вы не кешируете информацию раздела.Почему бы и нет ?Установите cacheName:@"Root", чтобы использовать преимущество NSFetchResultController.Обратите внимание, что это имеет смысл, только если настройки FetchRequestController неизменны.Насколько я вижу в вашем опубликованном коде, это то, что у вас есть здесь.Таким образом, вы должны пойти дальше и кешировать информацию вашего раздела.Ваши данные будут загружены в кеш только при первом запуске с небольшими накладными расходами, но позже будут замечены только изменения в вашем табличном представлении.

Я пытаюсь подумать, может ли это быть причиной вашей проблемыно есть только смутные предположения, в которых я не уверен, поэтому я оставлю их здесь.Но попробуйте изменить это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...