核心数据并发(NSOperation)

时间:2011-03-11 04:41:15

标签: iphone objective-c multithreading core-data nsoperation

在Apple docs中写道:

  

...你应该在中创建上下文   main(用于串行队列)或启动   (对于并发队列)。

但我真的没有得到有什么区别。为什么我不能在main中为并发队列创建上下文?我尝试了它,它的工作原理与我在start中完成的工作完全相同。

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

  

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

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

2 个答案:

答案 0 :(得分:5)

你所谓的'上下文'和'并发'之间可能存在差异,以及Apple的术语含义。他们以特定(且令人困惑)的方式使用“并发”。 Managing Concurrency With NSOperation的这一部分可能有所帮助:

  

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

     

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

答案 1 :(得分:2)

没有理由你不能在main()中为并发队列创建上下文,但是因为你必须在main中管理一个run loop,所以如果你在start()中设置像context这样的东西通常更好正在使用这种技术。