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