代码之家  ›  专栏  ›  技术社区  ›  Drux

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

  •  0
  • Drux  · 技术社区  · 10 年前

    为了避免核心数据的竞争情况,不同的线程应该使用不同的 NSManagedObjectContext s(参见例如。 here ).

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

    检查线程(或操作队列)之间的指针相等性是否适合用于指定目的?出于这个目的,比较线程和操作队列之间是否存在语义差异?(核心数据和UIKit等框架的Apple文档通常以线程的形式解释竞争条件的情况,例如:“为每个线程创建一个单独的托管对象上下文 线 并且共享单个持久性存储协调器。")

    更新 我现在已经了解到了(通过重温WWDC 2012年第2014届会议) 核心数据最佳实践 )使用 他俩 具有 NSPrivateThreadConcurrencyType 很可能会解决这一问题,这是未来的方向。然而,这个问题似乎仍然适用于传统选择 NSConfinedConcurrencyType .

    更新 从WWDC 2014会议开始 核心数据的新增功能 :launch参数 -com.apple.CoreData.ConcurrencyDebug 1 到目前为止,它也在iOS上得到了支持,并暗示了与我的目标几乎相同的断言(参见 here ).

    2 回复  |  直到 10 年前
        1
  •  0
  •   Ian MacDonald    10 年前

    我的理解是 isExecuting 仅表示线程尚未取消或完成。因此,将有多个线程 正在执行 一次。

    你的 == 要做的就是比较。

        2
  •  0
  •   Drux    10 年前

    事实证明,依靠核心数据自己的断言是一条出路(见更新的问题)。通过依赖,我不再需要在应用程序级别比较线程(或“线程”的其他抽象)的相等性。