Я использую NSFetchedResultsController, чтобы заполнить UITableView результатами из хранилища Core Data умеренного размера из ~ 1500 объектов.Контроллер результатов довольно стандартный - некоторые «горячие точки» для потенциальных ошибок не соответствуют этой настройке.
- Контекст управляемого объекта, созданный в том же (главном) потоке, что и используемый в
- Кэш не используется (поскольку сортировка часто меняется)
- sectionNameKeyPath используется для разделения результатов на секции
Однако результаты моего раздела очень странные.Например, рассмотрим этот метод, используемый для установки заголовков для представлений заголовка раздела:
- (NSString *)titleForHeaderInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.resultsController sections] objectAtIndex:section];
return [sectionInfo name]; // <------- Stopped at breakpoint here
}
Я остановился на указанной строке, используя точку останова, и, используя GDB, проверил следующее:
(gdb) po [[self resultsController] sectionNameKeyPath]
reviewDateString
(gdb) print section
$11 = 1
(gdb) print (int) [sectionInfo numberOfObjects]
$12 = 4
(gdb) po [sectionInfo name]
Wednesday, September 8th 2010
(gdb) po [[[sectionInfo objects] objectAtIndex:0] valueForKey:@"reviewDateString"]
Sunday, February 13th 2011
(gdb) po [[[sectionInfo objects] objectAtIndex:1] valueForKey:@"reviewDateString"]
Sunday, February 13th 2011
(gdb) po [[[sectionInfo objects] objectAtIndex:2] valueForKey:@"reviewDateString"]
Sunday, February 13th 2011
(gdb) po [[[sectionInfo objects] objectAtIndex:3] valueForKey:@"reviewDateString"]
Sunday, February 13th 2011
Проблема должна быть очевидной - почему [sectionInfo name] не совпадает со значениями sectionNameKeyPath для каждого управляемого объекта в разделе?Объекты в разделе выглядят правильно сгруппированными, название раздела просто неправильно задано.
Результаты выглядят еще более странно, если вы посмотрите на это:
(gdb) po [[self resultsController] indexPathForObject:(id)[[sectionInfo objects] objectAtIndex:0]]
<NSIndexPath 0x6615660> 2 indexes [459, 4294966310]
Теперь очевидноИсходя из вышеизложенного, возвращаемое значение NSIndexPath должно быть [1,0], а не это фиктивное значение.
Я полностью озадачен.У кого-нибудь есть идеи?Я буду наблюдать за этим вопросом, если вам понадобится дополнительная информация.
[Edit 1]
Одна странная вещь в моей настройке NSFetchedResultsController состоит в том, что я воссоздаю (освобождаю)и выделить / инициировать новый) контроллер результатов в ответ на изменение выбора UISegmentedControl.Это делается для того, чтобы изменить sortDescriptors запроса на выборку и sectionNameKeyPath, чтобы общая сортировка изменилась.
[Edit 2]
Метод resultsController простосредство доступа к свойству для NSFetchedResultsController, который я использую, сгенерированное @ synthesize.
Ожидаемые значения для имен разделов уже даны - имена разделов должны быть равны значениям для ключа @ "reviewDateString"(это sectionNameKeyPath), который я показал чуть ниже "po [sectionInfo name]", поэтому для этого случая это должно быть "Sunday, February 13th 2011".