NSFetchedResultsController performFetch 之后显然是错误的部分索引标题:
Apparently wrong section index title after NSFetchedResultsController performFetch:
我目前面临一个(对我来说)奇怪的问题如下:
我有一个 child MOC (NSManagedObjectContext
),大约有两打 MO (NSManagedObject
s)。每个 MO 都有一个可选的布尔属性 flag
。所有这些都设置为 @(NO)
。 fetchedResultsController
是一个 NSFetchedResultsController
,它获取这些 MO,其 managedObjectContext
是 moc
,其 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
我观察到以下情况:
fetchedResultsController.fetchedResults
包含与 moc
一样多的 MO,并且它们的所有标志都是 @(NO)
(正如人们所期望的那样)。
fetchedResultsController.sections.count
和 fetchedResultsController.sectionIndexTitles.count
都是 1
(正如人们所期望的那样,因为所有 flag
都具有相同的值)。
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
我目前面临一个(对我来说)奇怪的问题如下:
我有一个 child MOC (NSManagedObjectContext
),大约有两打 MO (NSManagedObject
s)。每个 MO 都有一个可选的布尔属性 flag
。所有这些都设置为 @(NO)
。 fetchedResultsController
是一个 NSFetchedResultsController
,它获取这些 MO,其 managedObjectContext
是 moc
,其 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
我观察到以下情况:
fetchedResultsController.fetchedResults
包含与moc
一样多的 MO,并且它们的所有标志都是@(NO)
(正如人们所期望的那样)。fetchedResultsController.sections.count
和fetchedResultsController.sectionIndexTitles.count
都是1
(正如人们所期望的那样,因为所有flag
都具有相同的值)。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