在一对多 CoreData 关系错误上调用“计数”是不是会将集合中的所有对象都带入内存?
Posted
技术标签:
【中文标题】在一对多 CoreData 关系错误上调用“计数”是不是会将集合中的所有对象都带入内存?【英文标题】:Does calling 'count' on a to-many CoreData relationship fault bring all objects in the collection into memory?在一对多 CoreData 关系错误上调用“计数”是否会将集合中的所有对象都带入内存? 【发布时间】:2011-08-06 18:10:39 【问题描述】:假设我有一个实体“员工”,它与另一个实体“部门”有一对多关系“部门”。如果我有一个 Employee 对象的实例并且部门集合当前出现故障,那么获取部门计数的最有效的内存方法是什么?
两个明显的选择是:
1) 拨打[myEmployee.departments count];
2) 构造一个 fetchRequest 以仅返回匹配的“员工”关系指向我的员工对象的部门对象,然后调用countForFetchRequest:
除了内存使用之外,这些方法中的任何一种是否会比另一种更快?
【问题讨论】:
【参考方案1】:除非您有 relationshipKeyPathsForPrefetching,否则不会获取关系。
但是,我对您的最佳建议是始终以最直接的方式实施您的解决方案,然后再解决性能问题。众所周知,人类不善于预测性能问题。
一个非常容易使用的工具是 Instruments,它包含在 Xcode 中。
您可以轻松地使用这两种方法运行测试,并实际比较数字,而不是仅仅听取一些陌生人对 SO 的意见。
【讨论】:
【参考方案2】:首先:当关系被调用时,对象被加载为“故障”,所以性能非常好。
第二:如果你使用countForFetchRequest方法,请求会是:
NSFetchRequest *f = Departament.fetchRequest;
f.predicate = [NSPredicate predicateWithFormat:@"ANY employees = %@", employe.objectID];
所以 CoreData 必须检查每个部门以查看员工。在实践中比较慢。
在你的情况下,我会使用第一个选项。 如果谓词需要对象的属性,情况会有所不同,因此第一个选项需要整个对象没有错误。在这种情况下,我建议使用 countForFetchRequest,但最好的选择是在特定情况下进行比较。【讨论】:
以上是关于在一对多 CoreData 关系错误上调用“计数”是不是会将集合中的所有对象都带入内存?的主要内容,如果未能解决你的问题,请参考以下文章