Имена разделов из NSFetchedResultsController не соответствуют значениям управляемого объекта - PullRequest
3 голосов
/ 16 февраля 2011

Я использую 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".

1 Ответ

10 голосов
/ 21 февраля 2011

Скорее всего, вам нужно исправить ваш sectionNameKey при получении.

Если этот путь ключа не совпадает с указанным первым дескриптором сортировки в fetchRequest, они должны генерировать те же относительные упорядочения.Например, первый дескриптор сортировки в fetchRequest может указывать ключ для постоянного свойства;sectionNameKeyPath может указывать ключ для переходного свойства, полученного из постоянного свойства.

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