2

我正在使用 NSFetchedResultsController 和 UITableViewController。

我在核心数据模型中创建了一个瞬态字段,用作 UITableView 部分的标签。该字段的名称是“sectionIndex”。在我的应用程序中,“客户”实体有许多“工作”(一对多) - 所以我检索工作的查询(通过部分)按关联的“客户”名称对它们进行分组。

我已经在我的代码库中将此方法实现为“工作”实体上的类别。

@implementation Job (TransientMethods)

- (NSString*)sectionIndex {
    NSLog(@"JobWrapper.Job.sectionIndex: %@", self.client.name);
    return self.client.name;
}

@end

并且字符串“sectionIndex”作为 sectionNameKeyPath 参数传递给 NSFetchedResultsController 的 init 方法。

如果我从模拟器中删除应用程序 - 那么应用程序第一次运行时,Jobs 的首页会按照此处列出的 sectionIndex 方法正确检索 Jobs 的 Client.name 并将 Jobs 分组。在日志中,我可以从字面上看到这个 sectionIndex 方法被多次调用。

但是,应用程序的后续运行不会调用 sectionIndex 方法......但是,部分标签仍然显示上次运行的值。这是怎么回事?运行之间是否有一些神奇的缓存?

这种行为会导致更大的问题。在查看 UITableView 时,如果我使用稍微不同的谓词释放和分配 NSFetchedResultsController,并且如果结果集是相同的大小,......那么这些相同的原始部分名称会出现在所有新结果中!

当然,没有新的日志条目。这意味着永远不会查找列,这意味着代码永远不会调用或查找瞬态字段。就好像这些领域没有错。

现在,如果备用查询返回不同数量的结果,则将加载部分名称。IE:在这种情况下,日志显示 - 在每次按下条形按钮时 - 正在调用的“sectionIndex”方法以及 UITableView 中显示的相应标签。

这太疯狂了——如果我有 2 个“活动”作业和 2 个“非活动”作业,并且我正在使用条形按钮在相应的查询之间来回切换……那么与初始查询相关联的任何部分标签都会显示给所有人后续表视图。

似乎 sectionNameKeyPath 字段仅由 FetchedResultsController 在结果集中有不同的结果时调用?实际结果不同 - 作业名称在实际行中正确显示 - 但同样,我不认为部分标签有错误或正确询问 NSFetchedResultsController 部分标签。我正在使用以下内容:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    int count = [[results_ sections] count];
    if (count > section) {
        id <NSFetchedResultsSectionInfo> sectionInfo = [[results_ sections] objectAtIndex:section];
        return [sectionInfo name];
    }
    return nil;
}

其中 results_ 是我为每个查询重新构建的 NSFetchedResultsController 。

我错过了什么吗?有没有办法手动清除 Core Data 缓存,使其不再那么聪明,并且在每次查询时,肯定会查找 sectionNameKeyPath?

对于它的价值,我取消了 xcdatamodel 中字段的“瞬态”选项,但我得到了相同的结果。

最后一个异常情况是,当我将第一个作业创建为非活动(不是默认的启动视图)时 - 如果我还创建了一个活动作业......非活动部分标签会同时贴在两者上。此外,当我关闭应用程序并重新开始时......非活动部分标签仍然显示 --- 即使在标题屏幕上,我正在显示应该显示完全不同标签的活动作业。

我不能不认为这是一个核心数据问题。重新启动应用程序返回的数据如此不正常是没有意义的。

4

1 回答 1

4

根据Marcus S. Zarra 的评论,我将cacheName设置为 nil:

results_ = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
            managedObjectContext:context_ 
            sectionNameKeyPath:@"sectionIndex" 
            cacheName:nil];
于 2010-01-25T19:57:52.533 回答