【问题标题】:CoreData: would it be safe using NSConfinementConcurrencyType and dispatch all operations using this context on a serial dispatch queue?CoreData:使用 NSConfinementConcurrencyType 并在串行调度队列上使用此上下文调度所有操作是否安全?
【发布时间】:2013-06-21 00:43:38
【问题描述】:

从字面上看,这种并发类型需要一个特定的线程,但使用串行队列会更容易,但是在串行调度队列上使用具有 NSConfinementConcurrencyType 并发类型的上下文是否安全?

【问题讨论】:

    标签: iphone ios core-data


    【解决方案1】:

    只要您确定只在上下文中使用该队列,是的,这完全没问题。

    Core Data 并不关心线程,而是关心并发访问。如果你序列化访问,你是安全的,但是你选择这样做。您可以使用NSRecursiveLock 或信号量或任何适合您的方式。

    请注意,较新的并发模型是基于队列的。 NSPrivateQueueConcurrencyType保证操作总是在同一个线程上执行,即使你使用performBlock:。它们发生在私有 queue 上,并且可能在不同时间在不同线程上运行。如果您可以很好地管理您的队列和访问权限以自己完成此操作,那么这样做是合理的。

    【讨论】:

      【解决方案2】:

      不,拥有串行队列并不能保证操作将在同一个线程上执行:

      Concurrency Programming Guide 指定

      串行队列(也称为私有调度队列)执行一项任务 一次按它们添加到队列中的顺序。这 当前正在执行的任务在不同的线程上运行(可能会有所不同 从任务到任务)由调度队列管理。串行 队列通常用于同步对特定资源的访问。

      为什么不直接使用 NSPrivateQueueConcurrencyType?它将使您的代码更清晰和线程安全。从初始化上下文的块以外的地方访问上下文时,您只需要调用-performBlock:-performBlockAndWait:

      【讨论】:

      • 正确,但是根据我的经验,串行队列提供了所需的线程安全性。它将保证在任何给定时间只有一个线程正在访问上下文(前提是您不要忘记在任何地方使用它)。
      • 确实如此。它应该足够线程安全,并且可能 privateQueue 上下文使用相同的技术,但 Apple 不建议这样做,实际上并没有公开上下文的私有队列。此外,在 WWDC 2011 的视频中,他们展示了新的块 API 和新的并发类型初始化器,他们明确表示不要弄乱上下文私有队列,因为它会破坏一切。我猜这是因为他们做了一些特殊的优化和锁定。
      • 是的,我在 iOS 5 和新的并发类型之前使用过这种技术。这些天来,我会坚持使用私人队列类型。我想苹果也这么说,主要是因为那里有成千上万的白痴,他们一无所知,只想做他们想做的事,然后在它不起作用时责怪苹果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 2018-05-06
      • 2018-12-06
      • 2018-12-29
      相关资源
      最近更新 更多