我一直在用NSFetchedResultsController做几个噩梦,并试图找到我的问题概述here的解决方案,我遇到了一些关于fetchedResultsController提取的数据的异常,特别是{{1}参数。
假设我有一个具有2个实体和关系的对象模型,如下所示:
商品<< - >的类别
Category有一个名为sectionNameForKeypath
的(NSNumber *)属性,用于将获取的 Item 实例分隔为表视图中的部分:
displayOrder
如果我想以某种方式动态操纵NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:moc
sectionNameKeyPath:@"category.displayOrder"
cacheName:nil];
的输出,那么显而易见的选择是覆盖其getter方法并在那里做任何我想做的事情。但问题是,displayOrder
的getter永远不会在fetchRequest或fetchedResultsController期间被访问,即使我在displayOrder
中指定它,我可以看到fetchedResultsController正在使用它的值分开并显示部分。
这是一个永远不会被调用的覆盖getter方法的简单示例。这被放在我的Category类中:
sectionNameForKeypath
我也尝试覆盖-(NSNumber*)displayOrder
{
NSLog (@"displayOrder getter called");
NSNumber *displayOrder = [NSNumber numberWithInt:0];
return displayOrder;
}
无效(也没有被调用,但这并不让我感到惊讶,因为我正在获取Item实例并通过关系访问类别及其属性)
所以最后我的问题是:awakeFromFetch
值是如何传递给我的fetchedResultsController的,有没有办法控制这个输出?
提前感谢您提出的任何想法!
罗格
答案 0 :(得分:1)
从iOS 3.2开始,NSFetchedResultsController会尽可能直接从数据库中使用sectionNameKeyPath标识的字段,而不是为每个项目创建对象。你可以尝试使用sectionNameKeyPath的非持久属性,它(根据文档)将强制它创建对象,但如果只是重命名UITableView的部分,那么最好在tableView:titleForHeaderInSection:
。