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

Assert same NSThread (NSOperationQueue) is current when NSManagedObjectContext is created and used

为了避免围绕 Core Data 的竞争条件,不同的线程应该使用不同的 NSManagedObjectContexts(参见 here)。

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

为所述目的检查线程(或操作队列)之间的指针是否相等是否合适?再次出于这个既定目的,比较线程和操作队列之间是否存在语义差异? (有关 Core Data 和 UIKit 等框架的 Apple 文档通常会根据线程解释竞争条件的情况,例如:"Create a separate managed object context for each thread and share a single persistent store coordinator.")

UPDATE 我现在已经了解到(通过重温 WWDC 2012 Session 2014 核心数据最佳实践)使用NSManagedObjectContextNSPrivateThreadConcurrencyType 可能会解决这个问题,这是可行的方法。但是,这个问题似乎仍然适用于遗留选择 NSConfinedConcurrencyType

更新 来自 WWDC 2014 session Core Data 的新增功能:启动参数 -com.apple.CoreData.ConcurrencyDebug 1到目前为止,iOS 也支持它,并且暗示与我的目标几乎相同的断言(参见 here)。

据我了解,isExecuting 仅表示线程尚未取消或结束。结果,一次会有多个线程isExecuting

你的 == 比较是要做的。

事实证明,依靠 Core Data 自己的断言是可行的方法(请参阅更新的问题)。通过依赖,我不再需要在应用程序级别比较线程(或 "threads" 的其他抽象)的相等性。