Я использую NSFetchedResultsController вместе с UITableViewController.
Я создал временное поле в моей модели базовых данных для использования в качестве метки для моих разделов UITableView. Название поля "sectionIndex". В моем приложении у сущности «Клиент» есть много «Заданий» (от 1 до многих), поэтому мой запрос на получение заданий группирует их (через раздел) по их ассоциированному имени «Клиента».
Я реализовал этот метод в своей кодовой базе в качестве категории для сущности 'Job'.
@implementation Job (TransientMethods)
- (NSString*)sectionIndex {
NSLog(@"JobWrapper.Job.sectionIndex: %@", self.client.name);
return self.client.name;
}
@end
и строка «sectionIndex» передается методу init для NSFetchedResultsController в качестве аргумента sectionNameKeyPath.
Если я удаляю приложение из симулятора, то при первом запуске приложения первая страница Jobs правильно получает и группирует задания по Client.name задания в соответствии с методом sectionIndex, перечисленным здесь. В журналах я буквально вижу этот метод sectionIndex, вызываемый несколько раз.
Однако при последующих запусках приложения НЕ вызывается метод sectionIndex ... и, тем не менее, метки разделов по-прежнему отображаются со значениями из последнего запуска. Как это происходит? Есть ли какое-то магическое кеширование между прогонами?
Такое поведение приводит к большей проблеме. При рассмотрении UITableView, если я освобождаю и назначаю NSFetchedResultsController с немного другим предикатом, и если результирующим набором является ОДИН РАЗМЕР, то эти же оригинальные имена разделов отображаются для всех НОВЫХ результатов!
И, конечно же, нет новых записей в журнале. Это означает, что столбцы никогда не ищутся, что означает, что код никогда не вызывает и не ищет переходные поля. Как будто эти поля не являются ошибочными.
Теперь, если альтернативный запрос возвращает РАЗНОЕ число результатов, то загружаются имена разделов. IE: в этом случае журналы показывают - при каждом нажатии кнопки на панели - вызывается метод sectionIndex и соответствующие метки отображаются в UITableView.
Это безумие - если у меня есть 2 «активных» задания и 2 «неактивных» задания, и я использую кнопку панели для переключения между соответствующими запросами ... тогда все метки разделов были связаны с начальным показом запроса для всех последующих табличных представлений.
Кажется, что поле sectionNameKeyPath вызывается FetchedResultsController только в том случае, если в наборе результатов имеется различное количество результатов? Фактические результаты отличаются - имена заданий корректно отображаются в реальных строках - но, опять же, я не думаю, что ярлыки разделов неисправны или не запрашивают NSFetchedResultsController для ярлыков разделов правильно. Я использую следующее:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
int count = [[results_ sections] count];
if (count > section) {
id <NSFetchedResultsSectionInfo> sectionInfo = [[results_ sections] objectAtIndex:section];
return [sectionInfo name];
}
return nil;
}
где results_ - это NSFetchedResultsController, который я создаю для каждого запроса.
Я что-то упустил? Есть ли способ вручную очистить этот кеш Core Data, чтобы он перестал быть таким умным и при каждом запросе обязательно просматривал sectionNameKeyPath?
Для чего оно стоит, я снял флажок «Transient» для полей в xcdatamodel, но получаю те же результаты.
И еще одно замечание: когда я создаю первое задание как неактивное (не по умолчанию при запуске) - если я также затем создаю активное задание ... метка неактивного раздела прикрепляется к обоим. Кроме того, когда я закрываю приложение и запускаю заново ... метка раздела "Неактивно" по-прежнему отображается, хотя на титульном экране я показываю Активное задание, которое должно показывать совершенно другую метку.
Не могу не думать, что это проблема основных данных. Нет никакого смысла в том, что перезапуск приложения возвращает данные так неожиданно.