如何启用对多关系对象属性的延迟加载?

Posted

技术标签:

【中文标题】如何启用对多关系对象属性的延迟加载?【英文标题】:How to enable lazy loading of to-many-relationship objects' properties? 【发布时间】:2013-11-04 10:48:36 【问题描述】:

我有一个 Post 对象,它在其他属性旁边包含一个布尔值“隐藏”和一个可能很长的字符串“内容”。有一个与 Post 对象具有一对多关系(反向)的 Feed 模型。

当我查询 Feed 中包含的 Post 对象,然后只访问每个获取的 Post 对象的“隐藏”属性时,我可以从 Core Data 的调试日志中看到它获取整个 Post 对象的属性。这意味着“内容”字符串(通常超过 3000 个字符)也是从 SQLite 数据库中获取的。我发现这大大减慢了所有 Post 对象的获取速度。

如何使 Post 对象访问延迟加载它们的属性,这意味着当我查询获取的 Post 对象的“隐藏”值时,不会获取其他参数。

我可能会补充一点,我使用 MagicalRecord 来访问核心数据。

我希望除了在手动 NSFetchRequest 实例上使用“propertiesToFetch”方法之外,还有另一种方法。

【问题讨论】:

【参考方案1】:

您是否阅读过核心数据编程指南中的Faulting and Uniquing? 特别关注"Turning Objects Into Faults"。

您可以使用refreshObject:mergeChanges: 方法将已实现的对象变为故障。

如果内存不是问题,而只是性能问题,您应该使用NSDictionaryRepresentation 类型并检索您需要的属性。

【讨论】:

其实我看到的主要问题不是获取 Post 对象后的内存消耗,而是从数据存储中获取 Post 对象的所有属性,我只请求“隐藏”财产。这会导致每个对象的获取持续时间较长,因为所有其他属性的值都是不必要地从数据存储中读取的。 好的,那么我想您必须使用NSDictionaryRepresentation 并使用propertiesToFetch 指定您的属性。另外 - 如果您只想排除隐藏一次,请使用谓词。

以上是关于如何启用对多关系对象属性的延迟加载?的主要内容,如果未能解决你的问题,请参考以下文章

如何在休眠/弹簧中更新多对多集合(延迟加载)?

如何在 NHibernate 中插入后启用延迟加载关系

NHibernate之(12):初探延迟加载机制

克服 Hibernate 中的延迟加载问题,多对多关系

关于extra加强延迟加载

Hibernate检索策略之延迟加载和立即加载