NSInvocationOperation和NSOperationQueue并发

iOS*_*com 3 concurrency cocoa multithreading objective-c grand-central-dispatch

我使用NSInvocationOperationNSOperationQueue在iOS5的发展.根据关于调用对象的 apple文档:

NSInvocationOperation类是NSOperation的具体子类...此类实现非并发操作.

好的,所以我的NSInvocationOperation对象同步执行?(在此纠正我)Apple的文档也说明了操作队列对象:

在iOS中,操作队列不使用Grand Central Dispatch来执行操作.它们为非并发操作创建单独的线程,并从当前线程启动并发操作.

我正在使用NSInvocationObject,这是一个非并发对象,并将其添加到操作队列,如下所示:

[operationQueue addOperation:operation];
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:1)由于操作队列将产生一个单独的线程来执行文档中所说的NSInvocationObject,它是否会异步运行而不是同步运行?

[更新 - 回应Dani的回答如下.取自Apple链接.

NSOperation和NSOperationQueue

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

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

Dan*_*ani 9

如果将其添加到操作队列,它将相对于其余代码异步运行,但在操作队列上同步运行.它非常像:

With synchronous objects:

Creating thread
    |
    |\
    | \______
    |        |
    |       Operation A
    |        |
    |       Operation B
    |        |
    |        |

With asynchronous objects:

Creating thread
    |
    |\
    | \___________________
    |                     |
    |\                  Operation A
    | \______             |
    |        |            |
    |       Operation B   |
    |        |            |
    |        |            |

  • 需要对你的图表做一个小的澄清.将同步NSInvocationOperation对象添加到NSOperationQueue使其功能类似于第一个图表?如果是这种情况,它会像串行队列一样运作吗? (2认同)