我有一个具有多个多对多关系的实体。我使用NSFetchedResultsController在tableview中呈现实体的某些属性。在实体具有的所有关系中,仅显示1个关系的值(它们当前在cellforrowat ...方法中出现故障)。在我看来,这可能会对性能产生影响。是否有可能在创建Fetch请求时对特定关系进行故障,以便CoreData在滚动表时不必获取值?
答案 0 :(得分:2)
首先,我不认为默认的Core Data行为的性能低于您提出的方法:如果没有数据支持您的工作,优化几乎肯定会出错。
那就是说,我相信-[NSFetchRequest setRelationshipKeyPathsForPrefetching:]
会完成你想要的。
答案 1 :(得分:2)
我不确定我是否理解您所描述的数据模型。如果您只显示实体的多对多关系的成员作为表行的内容,那么您可以使用-setPropertiesToFetch:在获取请求上仅获取每个可见行中显示的属性,就像在以下示例:
NSArray *propertiesToFetch = [[NSArray alloc] initWithObjects:@"title", @"thumbnailImage", nil];
[fetchRequest setPropertiesToFetch:propertiesToFetch];
[propertiesToFetch release];
但是,如果你所描述的是一个实体列表,表格行中显示的元素之一是一对一的关系,你可以像Barry建议的那样使用-setRelationshipKeyPathsForPrefetching:
。但是,在这种情况下,我建议对数据模型进行非规范化,并将该属性从关系中移动到直接位于原始实体中。遍历关系比访问属性要昂贵得多。
答案 2 :(得分:1)
您可以在对象中手动排除错误,但我认为您不会获得任何收益。无论您是一次性对所有对象造成错误,还是根据需要一次对一个对象进行错误处理,每个对象仍然会单独出现故障。
我编写的应用程序完全按照您的描述进行操作,大量数据出错以显示在表格视图中,并且从未注意到性能损失。请记住,只有与将要显示的表格视图单元格对应的对象才会出现故障。
总的来说,我会说不要试图超越核心数据。此时它已经有多年的性能优化。虽然直觉上看,100个对象中的错误可能需要100个数据库查询,但情况不一定如此。