代码之家  ›  专栏  ›  技术社区  ›  Douglas Mayle

多线程使用核心数据(nsOperationQueue和nsManagedObjectContext)

  •  14
  • Douglas Mayle  · 技术社区  · 15 年前

    在苹果的核心数据文档中 Concurrency with Core Data 它们列出了线程安全的首选方法,因为每个线程使用单独的nsManagedObjectContext,并具有共享的nsPersistentStoreCoordinator。

    如果在一个nsOperation队列中有许多nsOperation相继运行,那么在创建每个任务的上下文时会有很大的开销吗?

    当nsOperationQueue的最大并发操作计数为1时,我的许多操作将使用同一线程。我可以使用线程字典为每个线程创建一个nsmanagedObjectContext吗?如果我这样做,以后清理上下文会有问题吗?

    在这种情况下,使用核心数据的正确方法是什么?

    3 回复  |  直到 12 年前
        1
  •  19
  •   Barry Wark    15 年前

    在这种情况下使用核心数据的正确方法是创建一个单独的 NSManagedObjectContext 每次操作 有一个你锁定的上下文(通过 -[NSManagedObjectContext lock] 使用前和 -[NSManagedObjectContext unlock] 使用后)。如果操作是串行的,并且没有其他线程使用上下文,那么锁定方法可能是有意义的。

    哪种方法的使用是一个经验问题,没有数据是无法理解的。变量太多,无法使用常规规则。性能测试的硬数据是做出明智决策的唯一方法。

        2
  •  2
  •   Philippe Leybaert    15 年前

    使用nsOperationQueue启动的最大并发操作计数为1的操作不会在同一线程上运行所有操作。操作将一个接一个地执行,但每次都会创建一个新线程。

    因此,在线程字典中创建对象几乎没有用处。

        3
  •  2
  •   RonLugge    12 年前

    虽然这个问题很旧,但它实际上位于谷歌搜索结果的“nsmangedobjectContext线程”顶部,因此,我将提供一个新的答案。

    新的“首选”方法是使用initWithConcurrencyType:并告诉MOC它是主线程MOC还是辅助线程MOC。然后,您可以使用新的performblock:和performblockandwait:方法,MOC将负责在它的“本机”线程上序列化操作。

    然后,问题就变成了如何智能地处理应用程序可能产生的各种MOC之间的数据合并,以及使作为一个程序员的生活“有趣”的上千个其他细节。