当创建和使用NSManagedObjectContext时,断言相同的NSThread(NSOperationQueue)是当前的

时间:2015-02-04 15:20:20

标签: ios ios8 nsmanagedobjectcontext nsoperationqueue nsthread

为了避免Core Data周围的竞争条件,不同的线程应该使用不同的NSManagedObjectContext s(参见例如here)。

为了在运行时确保这一点,我想在每次使用托管对象上下文之前断言,相同的线程(或操作队列)是创建托管对象上下文时的最新线程。实际上,我想断言像NSThread.currentThread == storedThread(或NSOperationQueue.currentQueue == storedQueue)。

为了所述目的,检查线程(或操作队列)之间的指针是否相等是否合适?并且在比较线程和操作队列之间是否存在语义差异,再次出于此声明的目的? (Core Data和UIKit等框架的Apple文档通常根据线程解释有关竞争条件的情况,例如:“为每个线程创建单独的托管对象上下文并共享一个持久性存储协调器。 “)

更新我现在已经了解了(通过重新访问WWDC 2012年会话2014 核心数据最佳实践),NSManagedObjectContext使用了NSPrivateThreadConcurrencyType可能会解决这个问题,并且是要走的路。但是,问题似乎仍适用于遗留选择NSConfinedConcurrencyType

更新来自WWDC 2014会话核心数据中的新功能:现在iOS上也支持启动参数-com.apple.CoreData.ConcurrencyDebug 1,并且几乎意味着我所瞄准的相同断言(见here)。

2 个答案:

答案 0 :(得分:0)

据我了解,isExecuting只是表明线程没有被取消或完成。因此,一次有多个线程isExecuting

您的==比较是可以做的。

答案 1 :(得分:0)

依靠Core Data自己的断言结果证明是可行的方法(参见更新的问题)。通过依赖于我不再需要在应用程序级别比较线程的相等性(或“线程”的其他抽象)。