NSOperationQueue和并发与非并发

时间:2009-10-29 21:50:47

标签: iphone objective-c cocoa cocoa-touch multithreading

我想使用NSOperationQueue设置一个序列化的任务队列,但我对文档中讨论的术语感到有些困惑。

  

在NSOperation的背景下   对象,术语并发和   非并发不一定   指的是并行执行   线程。相反,非并发   操作是使用执行的操作   提供的环境   它是一个并发操作   负责建立自己的   执行环境。

设置“自己的执行环境”意味着什么?

我的NSOperation派生任务需要按照添加到队列的顺序连续执行。

所以我认为这意味着'非并发'操作,所以我为需要完成的工作实现'main',并为'isConcurrent'返回NO。此外,NSOperationQueue的'setMaxConcurrentOperationCount'将设置为1.

我没有在这些任务之间设置NSOperation依赖性的原因是因为它们插入队列的顺序是它们应该完成的顺序。

这些假设是否正确?

2 个答案:

答案 0 :(得分:25)

NSOperationQueue总是同时执行操作,同时考虑依赖关系。

“非并发”操作需要单独的线程才能并发执行。 NSOperationQueue负责提供此线程。换句话说,非并发操作取决于NSOperationQueue以使其成为并发操作。

“并发”操作本身是并发的;它不需要NSOperationQueue来为它创建一个线程。一个例子是使用异步文件IO的操作。

如果您希望串行执行两个或更多操作,则需要使用依赖项。

如果您希望操作阻止主线程,请不要使用NSOperationQueue;只需在主线程上一个接一个地运行每个操作。

要手动设置最大并发操作,请在operationQueue setMaxConcurrentOperationCount:

上使用方法

答案 1 :(得分:1)

你真的需要继承NSOperation吗?为什么不使用NSInvocationOperation及其addDependency:方法?

this SO question中查看我的回答。