线程限制已经过时。你可以在标题中看到这个 NSManagedObjectContext :
NSManagedObjectContext
NSConfinementConcurrencyType = 0x00, /* this option is obsolete and not recommended for new code. */
使用时创建上下文 -init ,它调用初始化程序 -initWithConcurrencyType: 与论点 NSConfinementConcurrencyType 。这是“并发核心数据编程指南”一节中描述的线程模型,该模型已经过时,一段时间内不推荐使用。用一位核心数据工程师的话说“它只是没用”。
-init
-initWithConcurrencyType:
NSConfinementConcurrencyType
遗憾的是,核心数据编程指南尚未更新,无法描述当前推荐的并发和其他改进的最佳实践。 但是,嘿,至少它没有告诉你使用锁定!
该 增量存储编程指南 最近已更新。它描述了如何实现NSIncrementalStore,并且这样做可以很好地解释一些Core Data的内部。例如,它描述了故障是什么以及故障的发生方式远远好于核心数据编程指南。核心数据发布过去的说明 几年 包含了一些有关最佳实践的最新信息,并且有一些与核心数据相关的技术说明。
过去几年中最好的信息是WWDC每年的“核心数据新内容”会议。对于并发性,您应该查看这些WWDC会话:
WWDC 2011 MacOS X上的核心数据有什么新功能 。 MacOS X会话比iOS会话更详细。
和
WWDC 2012核心数据最佳实践
我建议您使用“核心数据编程指南”页面上的“反馈”按钮,或者提出雷达错误,要求更新文档。
我一直关注的指南在这里: http://www.cocoanetics.com/2012/07/multi-context-coredata/ 即使它是在2012年写的,它似乎仍然符合我目前使用的东西。它可以帮助您使用NSMainQueueConcurrencyType设置主要父上下文,使用NSPrivateQueueConcurrencyType设置多个背景上下文,还可以使用具有持久性存储的后台编写器上下文。
XCode 6和Yosemite似乎也在核心数据调试方面有所改进: http://oleb.net/blog/2014/06/core-data-concurrency-debugging/ 。这有助于理解如何在正确的位置使用performBlock。
核心数据编程指南已针对iOS 9 / OS X El Capitan进行了更新。看到 https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Conceptual/CoreData/Concurrency.html 。
我也找到了 WWDC 2014 session 225 Core Data中的新功能 (在22:50)非常有助于理解当前和历史并发方法。
现在最好的讨论是在“并发”中 NSManagedObjectContext 文件 。
我的总结:
仍然需要线程限制。 iOS 5 / OS X v10.7引入的重大变化是,上下文现在可以将其他上下文作为父项,并可以管理自己的串行队列。
保存时,更改会自动从子级迁移到父级。这就是现在的意思。只有当您的父级是持久性存储时,才实际提交到磁盘。
因此,所有关于通过通知进行同步的内容都是Apple不希望您遵循的内容。所有这些机制仍然可用,但Apple已将最常见的模式直接引入框架中。