NSFetchedResultsController performFetch函数解码所有对象

时间:2016-01-28 17:39:25

标签: ios uitableview core-data nsfetchedresultscontroller

我很擅长使用Core Data,所以我可能做错了。

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

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

1 个答案:

答案 0 :(得分:1)

听起来这个属性是核心数据"可转换"属性,以便Core Data在加载和保存数据时自动调用NSCoding方法。

您所看到的内容对于该设计来说是正常的。当您获取托管对象时,它是一个"错误"没有属性值的对象。但只要您访问任何属性值,就会加载所有,包括转换。如果这是一个问题(我的第二个@Wain建议在根据假设进行更改之前使用Instruments验证这一点),您可以选择处理它。没有特别的顺序,这些包括:

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

这些都需要对代码进行一些重构,并提供不同程度的便利。