核心数据并发(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并发编程 (转)