在创建和使用 NSManagedObjectContext 时断言相同的 NSThread (NSOperationQueue) 是当前的
Assert same NSThread (NSOperationQueue) is current when NSManagedObjectContext is created and used
为了避免围绕 Core Data 的竞争条件,不同的线程应该使用不同的 NSManagedObjectContext
s(参见 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 核心数据最佳实践)使用NSManagedObjectContext
和 NSPrivateThreadConcurrencyType
可能会解决这个问题,这是可行的方法。但是,这个问题似乎仍然适用于遗留选择 NSConfinedConcurrencyType
。
更新 来自 WWDC 2014 session Core Data 的新增功能:启动参数 -com.apple.CoreData.ConcurrencyDebug 1
到目前为止,iOS 也支持它,并且暗示与我的目标几乎相同的断言(参见 here)。
据我了解,isExecuting
仅表示线程尚未取消或结束。结果,一次会有多个线程isExecuting
。
你的 ==
比较是要做的。
事实证明,依靠 Core Data 自己的断言是可行的方法(请参阅更新的问题)。通过依赖,我不再需要在应用程序级别比较线程(或 "threads" 的其他抽象)的相等性。
为了避免围绕 Core Data 的竞争条件,不同的线程应该使用不同的 NSManagedObjectContext
s(参见 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 核心数据最佳实践)使用NSManagedObjectContext
和 NSPrivateThreadConcurrencyType
可能会解决这个问题,这是可行的方法。但是,这个问题似乎仍然适用于遗留选择 NSConfinedConcurrencyType
。
更新 来自 WWDC 2014 session Core Data 的新增功能:启动参数 -com.apple.CoreData.ConcurrencyDebug 1
到目前为止,iOS 也支持它,并且暗示与我的目标几乎相同的断言(参见 here)。
据我了解,isExecuting
仅表示线程尚未取消或结束。结果,一次会有多个线程isExecuting
。
你的 ==
比较是要做的。
事实证明,依靠 Core Data 自己的断言是可行的方法(请参阅更新的问题)。通过依赖,我不再需要在应用程序级别比较线程(或 "threads" 的其他抽象)的相等性。