NSFetchedResultsSectionInfo不同意它有多少个对象

时间:2010-10-19 11:37:34

标签: iphone nsfetchedresultscontroller

我在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然后你就会得到正确的结果。尽管如此,仍然好奇为什么额外的对象出现在数组的末尾,而不是该部分的一部分。

2 个答案:

答案 0 :(得分:1)

这是问题最初提出后的5年半。我们在Xcode 7.x上,但这个bug似乎还在这里。有没有人弄清楚为什么会这样。我提出的解决方案只是在controllerDiDChangeContent中检查这个条件,如果它存在,重新创建FRC。对我来说,没关系,因为只有当你从0部分开始并在它下面添加第二部分时才会发生这种情况。这是关于如何重新创建这个bug的非常好的文章。我想不是很多人都把总数放在他们的页脚中。

https://devforums.apple.com/message/328077#328077

答案 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];
    }
}