除了WWDC 2012 视频和关于父子上下文的发行说明之外,Apple 没有发布任何真实文档。该视频非常详细地介绍了如何使用它们以及您可能需要使用 performBlock 或 performBlockAndWait 的极少数情况。
大多数人错过的重要一点是并发类型是指上下文将使用哪个线程来访问核心数据堆栈的其余部分,而不是创建上下文的线程。只要您继续实现线程限制模式,您几乎不需要在自己的代码中使用 performBlock 或 performBlockAndWait 。这样做通常会触发死锁(尤其是当一个或多个上下文是 NSMainQueueConcurrencyType 时)。
NSMainQueueConcurrencyType - 适用于 UI 中使用的 NSManagedObjects。您应该只维护其中之一。
NSPrivateQueueConcurrencyType - 适用于后台操作。从外部文件或 Web 服务导入新对象时,parentContext 是主要的 UI 上下文。当您完成创建对象时,save
会自动通知 parentContext 更改。您还可以使用私有上下文作为 UI 上下文的父级,以便在不阻塞 UI 的情况下从磁盘加载和保存存储。
因此,如果您创建子上下文并执行获取请求,它会使用线程(由并发类型指定)自动与父上下文交互。它将自动适当地使用 performBlock。当您保存子上下文时,父上下文会自动获取合并的更改,而无需您对父上下文执行任何操作。
如果您必须使用 performBlock 或 performBlockAndWait,则不再使用线程限制模式。它在线程限制模式中唯一有效的情况是跨越“表亲”上下文,其中父级有多个子级,一个子级的更改保存到父级,父级将这些更改下推给其他子级。