在一对多 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 关系错误上调用“计数”是不是会将集合中的所有对象都带入内存?的主要内容,如果未能解决你的问题,请参考以下文章

CoreData:使用 NSPredicate 过滤一对多对多关系(此处不允许错误对多键)

在 iPhone 应用程序中显示一对多关系的值的计数

CoreData 获取所有一对多关系

与 coredata 的一对多关系

CoreData 在一对多关系中编辑一个属性

无法使用 Swift 在 CoreData 中访问一对多关系