Почему NSFetchedResultsController неправильно загружает заголовки разделов? - PullRequest
2 голосов
/ 25 января 2010

Я использую 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, но получаю те же результаты.

И еще одно замечание: когда я создаю первое задание как неактивное (не по умолчанию при запуске) - если я также затем создаю активное задание ... метка неактивного раздела прикрепляется к обоим. Кроме того, когда я закрываю приложение и запускаю заново ... метка раздела "Неактивно" по-прежнему отображается, хотя на титульном экране я показываю Активное задание, которое должно показывать совершенно другую метку.

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

1 Ответ

4 голосов
/ 25 января 2010

За Комментарий Маркуса С. Зарры , я установил cacheName равным nil:

results_ = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
            managedObjectContext:context_ 
            sectionNameKeyPath:@"sectionIndex" 
            cacheName:nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...