NSPersistentContainer newBackgroundContext的最佳实践是什么?

时间:2018-06-24 21:22:00

标签: xcode core-data concurrency

我已经熟悉NSPersistentContainer。我想知道是否最好在每次需要在后台插入/获取某些实体或创建一个私有上下文时都使用newBackgroundContext生成私有上下文的实例,在整个生命周期中保留它并用于所有后台任务该应用程序。

文档还提供了便捷方法performBackgroundTask。只是想在这里找出最佳做法。

1 个答案:

答案 0 :(得分:4)

我通常推荐两种方法之一。 (还有其他可行的设置,但我使用了这两种设置,并对其进行了测试并建议使用。)

简单方法

您从viewContext中读取,然后写入到viewContext中,并且仅使用主线程。这是最简单的方法,可以避免很多核心数据常见的多线程问题。问题在于磁盘访问发生在主线程上,如果您要执行很多操作,这可能会降低应用程序的速度。

此方法适用于小型轻量级应用。任何拥有少于几千个实体的实体并且一次没有大量更改的应用程序将是一个很好的选择。一个简单的待办事项清单就是一个很好的例子。

复杂的方式

复杂的方法是仅从主线程上的viewContext中读取,并使用串行队列内的performBackgroundTask进行所有写操作。 performBackgroundTask内部的每个块都会重新获取它需要的所有ManagedObject(使用objectIds),并且它创建的所有ManagedObjects都会在该块的末尾丢弃。每个performBackgroundTask都是事务性的,在该块的末尾调用saveContext。

这是一个功能强大且功能强大的核心数据设置,可以管理任何合理规模的数据。

问题是,您总是要确保managedObjects来自您期望的上下文,并在正确的线程上进行访问。您还需要一个串行队列,以确保不会发生写入冲突。而且,您经常需要使用fetchedResultsController来确保在保存指向实体的指针时不会删除它们。