我已经创建了一个系统,我可以从单个对象请求NSManagedObjectContext,具体取决于它运行的队列。每个串行GCD调度队列都与某个任务相关联,因此获得自己的上下文,尽管它们都具有相同的持久性存储协调器。
我假设这将解决我与线程相关的问题,到目前为止它似乎已经完成了,但现在我有一个不同的问题:如果2个串行队列,具有不同的MOC,都试图创建上下文执行,他们都锁定和应用程序冻结。那我错过了什么?
“... [我]你为每个线程创建一个上下文,但都指向同一个持久存储协调器,Core Data负责以线程安全的方式访问协调器(NSManagedObjectContext的锁定和解锁方法)处理递归)。“ (source)
我在那里读到的是,Core Data应该使用我的设置正确处理锁定和解锁。或者在这种情况下,我是否以“线程安全的方式”理解错误?
编辑:我基本上有一个将队列映射到上下文的字典。起初我想使用线程而不是队列,直到我读到这一部分:
“注意:您可以使用线程,串行操作队列或调度队列进行并发。为了简明起见,本文始终使用”线程“来引用其中任何一个。” (source)
答案 0 :(得分:2)
如果“串行队列”是指GCD调度队列或NSOperationQueue
,那么您做出的错误假设是每个队列都有一个专用线程,或者每个队列的任务总是在同一个线程上运行。
您需要找到一种将线程映射到托管对象上下文的方法,可能通过NSDictionary,当您在队列上运行任务时,获取与当前线程关联的MOC。
答案 1 :(得分:1)
JeremyP是对的:队列不= =线程。队列可以为每个操作创建一个新线程 - 核心数据(在默认模式下)需要线程限制(也就是说,创建NSManagedObjectContext
的线程必须是用于从该上下文访问任何对象的线程)。
您可能想要查看限制选项的使用方式 - 如果您单独定位iOS5,您可以轻松更改它并仍然使用队列。