带有附加对象的 NSFetchedResultsController
Posted
技术标签:
【中文标题】带有附加对象的 NSFetchedResultsController【英文标题】:NSFetchedResultsController with additional objects 【发布时间】:2013-04-01 12:46:06 【问题描述】:我正在尝试使用 nsfetchedresultscontroller 从数据库中获取对象以在表格视图中显示。我想将一些自定义对象附加到获取的对象以用于显示目的。最好的方法是什么?
我当前的方法是将 [fetchedresultscontroller fetchedObjects] 存储在名为 objectsDatasource 的数组中,并将我的对象附加到其中。我使用这个 objectsDatasource 作为 tableview 的数据源。当我收到controllerDidChangeContent 时,我再次调用fetchedObjects 并重新加载我的objectsDatasource。会不会有性能问题?
替代方案是放弃 nsfetchedresultscontroller 并创建我自己的数组并将观察者添加到 NSManagedObjectDidSaveNotification。
[fetchedResultsController fetchedObjects] 最初是否将所有对象作为故障获取,并且仅在访问属性时触发故障?
【问题讨论】:
【参考方案1】:我将避免复制从获取结果控制器返回的数组,并尽可能将添加的结果保存在单独的数组中(从获取结果控制器返回的数组是存储在数据库中的实际数据的虚拟游标,并且可能实际上并未将整个数据集保存在内存中)。 如果附加项没有与从 fetch 结果控制器返回的结果混合,我什至可能会将它们放在表的自己的部分中。
[fetchedResultsController fetchedObjects] 最初是否将所有对象作为故障获取,并且仅在访问属性时触发故障?
这取决于分配给提取结果控制器的提取请求。
如果您设置:[request setReturnsObjectsAsFaults:NO]
和 [request setIncludesPropertyValues:YES]
,控制器将在首次从数据库中获取对象时出错,而在它们出现故障时不会再次出错(性能要好得多)。
【讨论】:
我真的不能把它们放在他们自己的部分。这些附加对象不存储在数据库中,而是根据获取的对象和用户交互动态计算。同样来自 Apple 文档:“结果数组反映了控制器托管对象上下文中托管对象的内存状态,而不是它们在持久存储中的状态。”那么“从获取结果控制器返回的数组是指向存储在数据库中的实际数据的虚拟指针,并且实际上可能不会将整个数据集保存在内存中”是什么意思? 我的意思是,如果结果数组的长度应该是 1000 个项目,它实际上并没有包含 1000 个项目,它会在您批量请求它们时获取并刷新对象(在获取请求批处理中设置尺寸)。如果你要复制这个数组,你最终会在内存中保存所有 1000 个项目(可能处于错误状态,但这取决于你编写的获取请求。这不是一个实际的 NSArray 实例,而是它的一个包装器这是明智的实施。以上是关于带有附加对象的 NSFetchedResultsController的主要内容,如果未能解决你的问题,请参考以下文章
无法在客户端附加带有多个压缩图像的 FormData() 对象
Swift - 如何将本地存储的对象数组(文件管理器)转换为较新的对象? (带有附加属性)