Core data 呼叫';计数';在多对多CoreData关系故障中,是否将集合中的所有对象放入内存?

Core data 呼叫';计数';在多对多CoreData关系故障中,是否将集合中的所有对象放入内存?,core-data,fault,Core Data,Fault,假设我有一个实体“员工”,其“部门”与另一个实体“部门”之间有一对多的关系。如果我有一个Employee对象的实例,并且departments集合当前是一个错误,那么获取部门数的内存效率最高的方法是什么 两个明显的选择是: 1) 调用[myEmployee.departments count] 2) 构造fetchRequest以仅返回匹配“employee”关系指向my employee对象的部门对象,然后调用countForFetchRequest: 除了内存使用之外,这两种方法中的任何一种

假设我有一个实体“员工”,其“部门”与另一个实体“部门”之间有一对多的关系。如果我有一个Employee对象的实例,并且departments集合当前是一个错误,那么获取部门数的内存效率最高的方法是什么

两个明显的选择是:

1) 调用
[myEmployee.departments count]

2) 构造fetchRequest以仅返回匹配“employee”关系指向my employee对象的部门对象,然后调用
countForFetchRequest:


除了内存使用之外,这两种方法中的任何一种都比另一种快得多吗?

除非您有RelationshipKeyPaths预取,否则不会获取关系

但是,我给您的最好建议是始终以最直接的方式实施您的解决方案,然后再解决性能问题。众所周知,人类不善于预测性能问题

一个非常容易使用的工具是仪器,它包含在Xcode中


您可以轻松地使用这两种方法运行测试,并实际比较数字,而不只是听取陌生人的意见。

首先:当关系被调用时,对象被加载为“fault”,因此性能非常好

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

NSFetchRequest *f = Departament.fetchRequest;

f.predicate = [NSPredicate predicateWithFormat:@"ANY employees = %@", employe.objectID];
因此,CoreData必须检查每个部门以查看员工。在实践中更慢

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