我在Apple dev论坛上发布了这个,因为它让我感觉像是实际SDK中的一个错误,但我想我也会在这里发布它,看看是否有人可以验证我是否正在使用这个事情不正确(似乎不喜欢)或这是破坏的行为。
https://devforums.apple.com/thread/72738
-
在花了一些时间调试一些代码之后,我发现了NSFetchedResultsSectionInfo
实例的一种非常奇怪和令人担忧的行为。
NSFetchedResultsController *frc = [self frcForTableView:tableView];
id <NSFetchedResultsSectionInfo> sectionInfo = [[frc sections] objectAtIndex:
[indexPath indexAtPosition:1]];
NSLog( @"Looking at %@ with section %@ (%d objects)",
indexPath, [sectionInfo objects], [sectionInfo numberOfObjects] );
基本上,我抓住一个FRC,然后将一个sectionInfo对象拉出来(不要担心为什么我抓住索引路径位置1而不是0 ......这应该不重要)。有趣的是,上面的NSLog输出是这样的:
Looking at <NSIndexPath 0x8828ee0> 2 indexes [0, 0] with section (
"TBN.B x 1 for order 1187",
"TBN.T x 1 for order 1187"
) (1 objects)`
因此[sectionInfo objects]
数组中有两个内容,但[sectionInfo numberOfObjects]
报告它只有一个。为了消除缓存问题的可能性,我在运行此代码之前禁用了FRC设置中的所有缓存。
在这里很难过。不知道单个sectionInfo对象如何能够不同意它有多少对象。
来自Apple开发者的任何想法?运行XCode 3.2.4和4.1 SDK。
编辑: FYI此部分的正确对象实际上是第一个(TBN.B)所以在我的测试中到目前为止看来,如果你只考虑对象数组的部分到numberOfObjects
然后你就会得到正确的结果。尽管如此,仍然好奇为什么额外的对象出现在数组的末尾,而不是该部分的一部分。
答案 0 :(得分:1)
这是问题最初提出后的5年半。我们在Xcode 7.x上,但这个bug似乎还在这里。有没有人弄清楚为什么会这样。我提出的解决方案只是在controllerDiDChangeContent中检查这个条件,如果它存在,重新创建FRC。对我来说,没关系,因为只有当你从0部分开始并在它下面添加第二部分时才会发生这种情况。这是关于如何重新创建这个bug的非常好的文章。我想不是很多人都把总数放在他们的页脚中。
答案 1 :(得分:0)
我的测试表明,第一部分的“objects”数组总是包含控制器中的所有对象。我认为这是一个框架错误。
这是一个非常脏(和缓慢)的解决方法:
NSArray * allObjects = self.cachedFetchedResultsController.fetchedObjects;
NSMutableArray * objectsInSectionZero = [NSMutableArray array];
for (id obj in allObjects) {
if ([[self.cachedFetchedResultsController indexPathForObject:obj] section] == indexPath.section) {
[objectsInSectionZero addObject:obj];
}
}