核心数据并发(NSOperation)

Posted

技术标签:

【中文标题】核心数据并发(NSOperation)【英文标题】:Core Data concurrency (NSOperation) 【发布时间】:2011-03-11 04:41:14 【问题描述】:

在 Apple docs 中是这样写的:

...您应该在 main(用于串行队列)或 start (对于并发队列)。

但我真的不明白有什么区别。为什么我不能在main 中为并发队列创建上下文?我试过了,它的工作原理与我在start 中所做的完全一样。

还有一件事让我感到困惑。来自start 方法的文档:

...如果您正在实施 并发操作,你必须 覆盖此方法并使用它来 开始您的操作。

那么,为什么我不能初始化 main 中的所有内容(或者可能不应该初始化)?

【问题讨论】:

【参考方案1】:

您所说的“上下文”和“并发”可能与 Apple 的术语含义有所不同。他们以特定(且令人困惑)的方式使用“并发”。 Managing Concurrency With NSOperation 的这一部分可能会有所帮助:

您可以通过多种不同的方式使用 NSOperation,但最常见的是编写自定义子类并覆盖一个方法:main。当 NSOperationQueue 调度它运行时,调用 main 方法来执行操作。以这种方式编写的 NSOperation 类称为非并发操作,因为开发人员不负责产生线程——多线程全部由超类处理。 (不要被术语混淆:一个操作是非并发的,并不意味着它不能并发执行,它只是意味着你不必自己处理并发。)

如果您需要更多地控制线程和操作的运行时环境,您可以使用并发操作。为此,您将 NSOperation 子类化并覆盖 start 方法。在 start 方法中,您可以在调用 main 方法之前生成线程并设置环境。您还需要通过设置 isExecuting 和 isFinished 等属性来维护 NSOperation 的状态。简而言之,并发操作为您提供了更多的控制权,但也需要更多的努力——对于大多数任务来说,非并发操作就足够了。

【讨论】:

NSOperation API 关于这个术语的编写方式非常愚蠢。我想大多数人都会对此感到困惑。【参考方案2】:

没有理由不能在 main() 中为并发队列创建上下文,但是由于您必须在 main 中管理运行循环,因此如果您在 start() 中设置诸如上下文之类的东西通常会更好正在使用该技术。

【讨论】:

以上是关于核心数据并发(NSOperation)的主要内容,如果未能解决你的问题,请参考以下文章

知其然亦知其所以然--NSOperation并发编程 (转)

iOS开发多线程--(NSOperation/Queue)

iOS开发多线程编程2 - NSOperation

为啥 NSOperation 示例代码使用@try & @catch

NSOperation 和 CoreData 线程

IOS多线程之NSOperation