NSFetchedResultsController的节名称与pipe理对象值不匹配

我正在使用一个NSFetchedResultsController来填充一个UITableView结果从一个中等规模的核心数据存储约1500个实体。 结果控制器是相当标准的 – 对于这种设置,潜在错误的一些“热点”是不正确的。

  • 在同一个(主)线程上创build的托pipe对象上下文与其上的一样
  • 没有使用caching(因为sorting频繁变化)
  • 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]不匹配部分中每个被pipe理对象的sectionNameKeyPath的值? 该部分中的对象似乎被正确分组,部分名称只是没有正确设置。

如果你看看这个结果,结果会更奇怪:

 (gdb) po [[self resultsController] indexPathForObject:(id)[[sectionInfo objects] objectAtIndex:0]] <NSIndexPath 0x6615660> 2 indexes [459, 4294966310] 

现在显然,从上面,返回的NSIndexPath应该是[1,0],而不是这个虚假的值。

我完全难倒了。 有人有主意吗? 如果您需要更多的信息,我会看这个问题。

[编辑1]

关于我的NSFetchedResultsController设置的一件奇怪的事情是,我重新创build(释放和分配/初始化一个新的)结果控制器响应UISegmentedControl的select更改。 这是为了更改提取请求和sectionNameKeyPath的sortDescriptors,以便整体sorting更改。

[编辑2]

resultsController方法只是我正在使用的NSFetchedResultsController的属性访问器,由@synthesize生成。

部分名称的期望值已经给出 – 部分名称应该等于我在“po [sectionInfo name]”下方显示的@“reviewDateString”键(它是sectionNameKeyPath)的值,所以对于这种情况他们应该是“2011年2月13日星期天”。

您可能需要修正您的sectionNameKey在提取。

如果此关键path与fetchRequest中第一个sorting描述符指定的关键path不相同,则它们必须生成相同的相关sorting。 例如,fetchRequest中的第一个sorting描述符可以指定持久属性的关键字; sectionNameKeyPath可以为从持久性属性派生的瞬态属性指定一个键。