核心数据第2部分。 —子上下文和多个托管对象上下文

多个托管对象上下文

Core Data的默认配置为您提供了与主队列关联的单个托管对象。 刷新托管对象上下文是一个内存暂存器,您可以在使用托管对象时使用它。

什么时候需要多个托管对象上下文?

1.编辑数据→可以将托管对象上下文视为一组更改,应用程序可以通过子上下文丢弃这些更改。 可以将编辑的数据视为新信息,例如便笺本。 数据编辑后,您可以保存或删除。

2.导出数据(长时间运行的任务)→仅使用单个主队列管理对象上下文来阻止应用程序的主线程,然后UI会被阻止并且无法正确更新。

导出数据时的默认行为是让您的导出操作和UI都使用主队列执行其工作,但是如果此导出是一项长期运行的任务,则UI将滞后并且会有延迟。 传统上,您可以将数据导出运行到后台队列中,但是Core Data受管对象上下文不是线程安全的。 您不能将操作分派到后台队列,也不能使用相同的Core Data Stack。

Apple开发者网站上有关您的上下文的一些上下文:

通常,避免在与用户无关的主队列上进行数据处理。 数据处理可能会占用大量CPU,并且如果在主队列上执行数据处理,则会导致用户界面无响应。 如果您的应用程序将要处理数据,例如将数据从JSON导入到Core Data中,请创建一个私有队列上下文并在该私有上下文上执行导入。 以下示例显示了如何执行此操作:

让我们看一下第5行中发生的情况。新上下文设置为运行该应用程序的主要上下文的子级。 子托管对象上下文是临时暂存器,从本质上讲,它是可编辑更改的容器,可以将其丢弃或修改并随父上下文的更改一起保存。 保存子上下文后,更改仅转到父上下文。 保存父上下文后,父上下文中的更改将发送到持久性存储协调器。

此外,每个管理对象上下文都有一个父存储,如果它是CoreDataStack类提供的主要上下文,则通常是持久存储容器。