NSFetchedResultsController performFetch之后显然错误的部分索引标题:

时间:2015-02-18 08:47:05

标签: ios core-data nsfetchedresultscontroller

我目前面临一个(对我而言)奇怪的问题如下:

我有一个孩子MOC(NSManagedObjectContext),有大约二十个MO(NSManagedObject s)。每个MO都有一个可选的布尔属性flag。所有这些都设置为@(NO)fetchedResultsController是一个NSFetchedResultsController,用于提取这些MO,其managedObjectContextmoc且其sectionNameKeyPath@"flag"fetchedResultsController flag上还有一个sort descriptor(以及另一个辅助排序属性)。

运行这些代码后

NSAssert(!moc.hasChanges, nil); // no unsaved changes
BOOL flag = [fetchedResultsController performFetch: &error];
NSAssert(flag && (error == nil), nil); // no errors

我观察到以下内容:

  1. fetchedResultsController.fetchedResults包含与moc一样多的MO,并且所有标志都是@(NO)(正如人们所期望的那样)。
  2. fetchedResultsController.sections.countfetchedResultsController.sectionIndexTitles.count都是1(正如人们所期望的那样,因为所有flag都具有相同的值。)
  3. fetchedResultsController.sectionIndexTitles[0]@"1"
  4. 第三项似乎对我不对。我原以为@"0"(因为这是[@(NO) description]的{​​{3}})。

    这里可能出现什么问题,如何在这种情况下获得正确的部分索引标题?

    更新我现在看起来好像问题(capitalized first letter)与使用flag(可选的布尔核心数据属性)相关sectionNameKeyPath。即使flag的值不同,performFetch:也会导致只有一个标题为@"1"的部分。

1 个答案:

答案 0 :(得分:1)

我认为依靠节标题字段的description实现是不可靠的。这可能适用于字符串,但这似乎是违反直觉的,这是数值的预期解决方案。无论如何,您可能不希望在最终实现中使用这些值。

你应该实现sectionIndexTitleForSectionName,检查那里的布尔值并返回一个正确的字符串。请注意,此方法已接收字符串,因此您需要检查它是否正确。我怀疑它不是,你必须确保NSNumber生成正确的字符串。也许您需要将一个方法添加到NSNumber作为类别,以返回布尔值的正确字符串。您的sectionNameKeyPath将类似于“flag.toString”或类似内容。

您可能想要检查的另一件事:根据您设置托管对象子类和模型的方式,您可能忘记取消引用NSNumber的值。

BOOL falseValue = @(NO).boolValue; // NO

BOOL falseValue = @(NO);           // YES