【发布时间】:2015-04-21 19:13:27
【问题描述】:
我有一个核心数据对象 RootObject。 此对象具有其他对象的数组/关系,ChildrenObject[]。
当执行 NSFetchRequest 来获取我所有的 RootObject 时,我会得到一个包含所有这些的数组。
CoreData 的工作方式是它只按需加载属性,这意味着只有当我访问我的 ChildrenObject 属性时,该属性才会从文件中加载。
类似:
RootObject.childrenObjects.firstObject.someChildrenObjectProperty
CoreData 只会在第一次访问该属性时将 someChildrenObjectProperty 加载到内存中。
有没有办法强制 CoreData 在 NSFetchRequest 执行期间的某个地方提前加载它?
一种选择是遍历所有获取的 RootObject 项目并仅访问属性,但我想知道在 CoreData 级别上是否有更好的方法来执行此操作(一些设置标志,获取标志)。
【问题讨论】:
-
只是好奇,你为什么要这么做?我想不出一个合理的用例。
-
RootObject 是 UICollectionView 中显示的照片。它有一个 ChildrenObjects 数组。我需要遍历该数组来计算一些东西,这样我才能知道如何根据它显示我的单元格。当我启动应用程序并快速滚动该集合视图时,我注意到一个小问题。在下一次滚动时一切正常。我分析了应用程序并注意到在第一次滚动时,在 ChildrenObject 中花费了一些时间。 someChildrenObjectProperty 所以我认为这是第一次访问属性,CoreData 正在从文件中读取它。
-
因为在第一次滚动后无论如何我都会在内存中的所有数据中结束,我想从头开始预取它以避免第一次滚动打嗝。我可以对此进行优化,以确保只预取我所做的 ChildrenObject 数组 (setRelationshipKeyPathsForPrefetching)。其他选项是在每个 OtherObject 数组更改时计算此值,但我想要一个更快的解决方案,这对我来说效果很好。
-
好的,明白了。谢谢(你的)信息。太糟糕了,这不会扩展。但我很高兴它有效。
-
您有什么建议吗?由于这些都是非常轻量级的对象,所以我认为它不会对内存产生太大影响。
标签: objective-c core-data