使用 MagicalRecord 3 的 CoreData 内存设置

Posted

技术标签:

【中文标题】使用 MagicalRecord 3 的 CoreData 内存设置【英文标题】:CoreData in-memory setup with MagicalRecord 3 【发布时间】:2016-03-01 17:07:05 【问题描述】:

您好,我正在使用 CoreData + MagicalRecord 3 来管理我的应用程序中的数据。在那之前一切正常,但后来我意识到在生产中比我的应用程序冻结得像地狱一样! 所以我开始调查了解这样一个事实,即不卡住 UI,最好有一个主上下文和一个背景上下文,并在后台保存东西等......

尽管如此,由于我的设置,我不得不质疑。我使用 CoreData 内存存储系统(以获得最佳性能)并且我不关心将数据存储在我的应用程序的磁盘上,我可以使用 volatile 模型,当应用程序被杀死或在后台时将被破坏时间过长。我只是希望能够从任何视图控制器中找到我的数据,而无需耦合。

所以我有几个问题: 1)如果我使用 1 个唯一上下文,如果我从不将其保存到内存存储中会发生什么?例如,如果我 MR_createEntity 然后我从上下文中检索这个实体并更新它,它是在任何地方更新还是我必须保存它以便它可以更新?换句话说,是在内存中保存您不想永久保存数据的兴趣吗?

2) 如果我使用 1 个我声明为背景的唯一上下文,如果我在数据完成保存之前显示我的屏幕,屏幕将无法找到并显示我的数据,对吗?除非我使用 NSFetchResultController 对吗?

【问题讨论】:

【参考方案1】:

1) 出于几个原因,即使使用内存存储,您也希望保存数据。首先,以便您可以在您可能改变主意并保留数据的情况下正确使用核心数据。其次,您可能希望访问和处理不同线程/队列上的一些数据。在这种情况下,您必须使用 Core Data 的线程/队列数据安全机制。 store 是 Core Data 跨线程同步数据的最低级别(旧方式)。如果您使用嵌套上下文来同步数据(新方式),这可能不太重要。但即使使用嵌套上下文,您也需要调用 save 以便您的更改跨上下文合并。当您保存到 nil 存储时,Core Data 并不喜欢它。

2) 您可以创建和使用自己的上下文来显示数据。 NSFetchedResultsController 在侦听正确的通知方面做了很多工作,并确保您首先获得针对您要求的数据的非常具体的更新。 NSFRC 并不总是必要的,但肯定是最简单的开始方式。

【讨论】:

以上是关于使用 MagicalRecord 3 的 CoreData 内存设置的主要内容,如果未能解决你的问题,请参考以下文章

Plain Core Data vs Core Data + Magical Record

导入与 Core Data 和 Magical Record 的关系

Swift 3 - MagicalRecord:如何在空实体上使用 findFirst

MagicalRecord 3.0 设置

使用 MagicalRecord 3 的 CoreData 内存设置

如何在 Core Data 和 Magical Record 中存储一系列电子邮件