NSPersistentContainer newBackgroundContext 的最佳实践是什么?

Ros*_*iak 3 concurrency xcode core-data

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

该文档还提供了方便的方法performBackgroundTask。只是想找出这里的最佳实践。

Jon*_*ose 5

我通常推荐两种方法之一。(还有其他可行的设置,但这是我使用过并经过测试并推荐的两种设置。)

简单的方法

您从 viewContext 读取并写入 viewContext 并且仅使用主线程。这是最简单的方法,可以避免很多核心数据常见的多线程问题。问题是磁盘访问发生在主线程上,如果你做了很多,它可能会减慢你的应用程序。

这种方式适用于小型轻量级应用。任何实体总数少于几千个并且一次没有批量更改的应用程序都将是一个很好的候选者。一个简单的待办事项列表就是一个很好的例子。

复杂的方式

复杂的方法是仅从主线程上的 viewContext 中读取,并在串行队列中使用 performBackgroundTask 进行所有写入。performBackgroundTask 中的每个块都会重新获取它需要的任何托管对象(使用 objectId),并且它创建的所有托管对象都在块的末尾被丢弃。每个 performBackgroundTask 都是事务性的,并且在块的末尾调用 saveContext。更完整的描述可以在这里找到:NSPersistentContainer concurrency for save to core data

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

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