我一直在使用 NSFetchedResultsController 做一些噩梦,并试图找到解决我的问题的解决方案 here ,我发现 fetchedResultsController 获取的数据有些不寻常,特别是 sectionNameForKeypath
参数。
假设我有一个包含 2 个实体和关系的对象模型,如下所示:
项目 <<--> 类别
Category 有一个名为 displayOrder
的 (NSNumber*) 属性,用于将获取的 Item 实例分成表格 View 中的部分:
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:moc
sectionNameKeyPath:@"category.displayOrder"
cacheName:nil];
如果我想以某种方式动态地操纵 displayOrder
的输出,显而易见的选择是覆盖它的 getter 方法并在那里做我想做的任何事情。但问题是,即使我在 sectionNameForKeypath
中指定了 displayOrder
的 getter,在 fetchRequest 期间或 fetchedResultsController 也根本不会访问它,而且我可以看到fetchedResultsController 使用它的值来分隔和显示各个部分。
这是一个被覆盖的 getter 方法的简单示例,该方法永远不会被调用。这被放置在我的 Category 类中:
-(NSNumber*)displayOrder
{
NSLog (@"displayOrder getter called");
NSNumber *displayOrder = [NSNumber numberWithInt:0];
return displayOrder;
}
我还尝试覆盖 awakeFromFetch
无济于事(也没有被调用,但这并不令我感到惊讶,因为我正在获取 Item 实例并通过访问类别及其属性关系)。
最后我的问题是:category.displayOrder
值如何传递到我的 fetchedResultsController,有没有办法让我控制这个输出?
预先感谢您的任何想法!
罗格
最佳答案
自 iOS 3.2 起,NSFetchedResultsController 尽可能直接从数据库使用由sectionNameKeyPath 标识的字段,而不是为每个项目创建对象。您可以尝试对sectionNameKeyPath使用非持久属性,这(根据文档)将强制它创建对象,但如果只是重命名UITableView的部分,那么最好在中进行映射tableView:titleForHeaderInSection:
.
关于ios - NSFetchedResultsController -sectionNameForKeypath 如何获取其数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5371713/