我正在熟悉NSPersistentContainer。我想知道每次我需要在后台插入/获取一些实体时,是否最好用newBackgroundContext生成一个私有上下文的示例,或者创建一个私有上下文,保留它并在应用程序的生命周期中用于所有后台任务。该文档还提供了方便的方法performBackgroundTask。只是想找出最好的做法。
NSPersistentContainer
newBackgroundContext
performBackgroundTask
7vhp5slm1#
我通常推荐两种方法之一。(还有其他的设置可以工作,但这是我用过的两个,经过测试并会推荐。)
你可以从viewContext中读取,也可以向viewContext中写入,并且只使用主线程。这是最简单的方法,避免了许多核心数据常见的多线程问题。问题是磁盘访问发生在主线程上,如果你做了很多,它可能会减慢你的应用程序。这种方法适用于小型轻量级应用。任何实体总数少于几千个并且没有一次大量更改的应用程序都是一个很好的候选者。一个简单的待办事项列表,将是一个很好的例子。
复杂的方法是只从主线程上的viewContext读取,并在串行队列中使用performBackgroundTask执行所有写入操作。performBackgroundTask中的每个块重新获取它需要的任何managedObject(使用objectIds),并且它创建的所有managedObject在块的末尾被丢弃。每个performBackgroundTask都是事务性的,并且在块的末尾调用saveContext。更完整的描述可以在这里找到:用于保存到核心数据的NSPersistentContainer并发这是一个强大且功能强大的核心数据设置,可以以任何合理的规模管理数据。问题是,您必须始终确保managedObjects来自您期望的上下文,并且在正确的线程上访问。您还需要一个串行队列来确保不会发生写入冲突。而且你经常需要使用fetchedResultsController来确保实体在你持有指向它们的指针时不被删除。
1条答案
按热度按时间7vhp5slm1#
我通常推荐两种方法之一。(还有其他的设置可以工作,但这是我用过的两个,经过测试并会推荐。)
The Simple Way
你可以从viewContext中读取,也可以向viewContext中写入,并且只使用主线程。这是最简单的方法,避免了许多核心数据常见的多线程问题。问题是磁盘访问发生在主线程上,如果你做了很多,它可能会减慢你的应用程序。
这种方法适用于小型轻量级应用。任何实体总数少于几千个并且没有一次大量更改的应用程序都是一个很好的候选者。一个简单的待办事项列表,将是一个很好的例子。
复杂方式
复杂的方法是只从主线程上的viewContext读取,并在串行队列中使用performBackgroundTask执行所有写入操作。performBackgroundTask中的每个块重新获取它需要的任何managedObject(使用objectIds),并且它创建的所有managedObject在块的末尾被丢弃。每个performBackgroundTask都是事务性的,并且在块的末尾调用saveContext。更完整的描述可以在这里找到:用于保存到核心数据的NSPersistentContainer并发
这是一个强大且功能强大的核心数据设置,可以以任何合理的规模管理数据。
问题是,您必须始终确保managedObjects来自您期望的上下文,并且在正确的线程上访问。您还需要一个串行队列来确保不会发生写入冲突。而且你经常需要使用fetchedResultsController来确保实体在你持有指向它们的指针时不被删除。