2011-08-06 13 views
5

假设我有一个实体'员工'与多个关系'部门'到另一个实体'部门'。如果我有一个Employee对象的实例,并且这个部门集合目前是一个错误,那么获得部门数量的最有效的方法是什么?在多对多CoreData关系错误上调用'count'是否将集合中的所有对象都带入内存?

两个明显的选项是:

1)调用[myEmployee.departments count];

2)构建fetchRequest只返回Department对象,其匹配的“员工”关系指向我的员工对象,然后调用countForFetchRequest:

除了内存使用情况以外,其他方法中的任何一种方法都会不可忽略地更快?

回答

0

除非您有relationshipKeyPathsForPrefetching,否则不会提取关系。

但是,我最好的建议是始终以最直接的方式实施您的解决方案,然后再解决性能问题。人类在预测性能问题方面表现出色。

一个非常容易使用的工具是Instruments,包含在Xcode中。

您可以使用两种方法轻松运行测试,并实际比较数字,而不仅仅是针对SO上的某个陌生人的意见。

0

第一:当关系被调用时,对象被加载为“故障”,所以性能非常好。

第二:如果您使用countForFetchRequest方法,请求将是:

NSFetchRequest *f = Departament.fetchRequest; 

f.predicate = [NSPredicate predicateWithFormat:@"ANY employees = %@", employe.objectID]; 

所以CoreData必须检查每个部门看员工。在练习中更慢。

  • 在你的情况下,我会使用第一个选项。
  • 如果谓词需要对象的属性,情况会有所不同,所以第一个选项需要整个对象没有错误。在这种情况下,我建议使用countForFetchRequest,但最好的选择是在特定情况下进行比较。