NSFetchedResultsController performFetch 函数解码所有对象

NSFetchedResultsController performFetch function decodes all objects

我对使用 Core Data 还很陌生,所以我可能做错了什么。

我将 NSFetchedResultsControllerUITableView 一起使用,performFetch() 函数解码相应实体中的所有对象。但是,我只想解码 prepareForSegue 函数中的一个,而不是在加载视图时立即解码所有这些,因为解码我的自定义对象需要一段时间。

我该如何解决?我是否应该创建一个额外的实体来包含我不需要绘制 table 单元格但只在下一个视图中需要的信息,或者一对一的关系在这里是否合适?

听起来这个属性是 Core Data "transformable" 属性,因此 Core Data 在加载和保存数据时会自动调用 NSCoding 方法。

您所看到的对于该设计来说是正常的。当您获取托管对象时,它是一个没有 属性 值的 "fault" 对象。但是,一旦您访问 any 属性值,就会加载 all 属性值,包括可变形对象。如果这是一个问题(我支持@Wain 的建议,即在根据假设进行更改之前使用 Instruments 来验证这一点),您可以选择一些方法来处理它。排名不分先后,包括:

  • 将属性设为 "binary" 而不是 "transformable",然后添加您自己的代码以仅在实际需要时调用 NSCoding 方法。这两种属性类型都意味着该值存储为二进制 blob,唯一的区别是您是调用 NSCoding 方法还是让 Core Data 为您做。通过此更改,您仍会将所有属性的数据加载到内存中,但您不会 运行 通过 init(coder:) 方法 until/unless 您认为有必要。
  • 在提取请求上使用 propertiesToFetch,同时将 requestType 设置为 NSDictionaryResultType。这会让你不获取这个属性,但是它会给你 NSDictionary 个对象而不是 NSManagedObject (或你的子类)。
  • 将此属性的数据移动到一个单独的相关实体中。核心数据故障触发加载对象的属性值,但不加载其相关对象。因此,在您决定遍历关系之前,您可以获取正在获取但没有任何数据的任何实体 encode/decode。

其中每一个都需要对代码进行一些重构,以提供不同程度的便利。