【问题标题】:Force loading of all properties in memory when executing NSFetchRequest?执行 NSFetchRequest 时强制加载内存中的所有属性?
【发布时间】:2015-04-21 19:13:27
【问题描述】:

我有一个核心数据对象 RootObject。 此对象具有其他对象的数组/关系,ChildrenObject[]

当执行 NSFetchRequest 来获取我所有的 RootObject 时,我会得到一个包含所有这些的数组。

CoreData 的工作方式是它只按需加载属性,这意味着只有当我访问我的 ChildrenObject 属性时,该属性才会从文件中加载。

类似:

RootObject.childrenObjects.firstObject.someChildrenObjectProperty

CoreData 只会在第一次访问该属性时将 someChildrenObjectProperty 加载到内存中。

有没有办法强制 CoreDataNSFetchRequest 执行期间的某个地方提前加载它?

一种选择是遍历所有获取的 RootObject 项目并仅访问属性,但我想知道在 CoreData 级别上是否有更好的方法来执行此操作(一些设置标志,获取标志)。

【问题讨论】:

  • 只是好奇,你为什么要这么做?我想不出一个合理的用例。
  • RootObject 是 UICollectionView 中显示的照片。它有一个 ChildrenObjects 数组。我需要遍历该数组来计算一些东西,这样我才能知道如何根据它显示我的单元格。当我启动应用程序并快速滚动该集合视图时,我注意到一个小问题。在下一次滚动时一切正常。我分析了应用程序并注意到在第一次滚动时,在 ChildrenObject 中花费了一些时间。 someChildrenObjectProperty 所以我认为这是第一次访问属性,CoreData 正在从文件中读取它。
  • 因为在第一次滚动后无论如何我都会在内存中的所有数据中结束,我想从头开始预取它以避免第一次滚动打嗝。我可以对此进行优化,以确保只预取我所做的 ChildrenObject 数组 (setRelationshipKeyPathsForPrefetching)。其他选项是在每个 OtherObject 数组更改时计算此值,但我想要一个更快的解决方案,这对我来说效果很好。
  • 好的,明白了。谢谢(你的)信息。太糟糕了,这不会扩展。但我很高兴它有效。
  • 您有什么建议吗?由于这些都是非常轻量级的对象,所以我认为它不会对内存产生太大影响。

标签: objective-c core-data


【解决方案1】:

NSFetchRequest.returnsObjectsAsFaultsNSFetchRequest.setRelationshipKeyPathsForPrefetching

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2013-03-13
    • 1970-01-01
    • 2015-11-13
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多