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

Apparently wrong section index title after NSFetchedResultsController performFetch:

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

我有一个 child MOC (NSManagedObjectContext),大约有两打 MO (NSManagedObjects)。每个 MO 都有一个可选的布尔属性 flag。所有这些都设置为 @(NO)fetchedResultsController 是一个 NSFetchedResultsController,它获取这些 MO,其 managedObjectContextmoc,其 sectionNameKeyPath@"flag"fetchedResultsControllerflag 上也有一个 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".

第三项我觉得不对。我本以为 @"0"(因为这是 [@(NO) description]capitalized first letter)。

这里可能有什么问题,在这种情况下如何获得正确的章节索引标题?

UPDATE 我现在看起来问题可能是 () 与使用 flag(一个可选的布尔核心数据属性)有关 sectionNameKeyPath。即使 flag 的值不同,performFetch: 只会导致一个标题为 @"1".

的部分

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

您应该实施 sectionIndexTitleForSectionName,检查那里的布尔值和 return 一个正确的字符串。请注意,此方法已经接收到一个字符串,因此您需要检查它是否正确。我怀疑不是,您必须确保 NSNumber 生成正确的字符串。也许您需要将方法添加到 NSNumber 作为 return 布尔值的正确字符串的类别。您的 sectionNameKeyPath 将类似于 "flag.toString" 或类似的东西。

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

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

但是

BOOL falseValue = @(NO);           // YES