У меня есть приложение для 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 раз у меня не было сбоев.Кажется, я получаю сбои только тогда, когда контекст управляемого объекта содержит только несколько объектов!Это так странно.