NSInvocationOperation和NSOperationQueue并发

时间:2011-12-10 03:26:53

标签: objective-c multithreading cocoa concurrency grand-central-dispatch

我在iOS5中使用NSInvocationOperation NSOperationQueue进行开发。 根据关于调用对象的Apple文档

  

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

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

  

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

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

[operationQueue addOperation:operation];

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

[更新 - 回应Dani的回答如下。取自Apple link

  

NSOperation和NSOperationQueue

     

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

     

如果您需要更多地控制线程和运行时环境   对于您的操作,您可以使用并发操作。去做   这个,你继承NSOperation并覆盖start方法。在里面   启动方法,您可以生成线程并设置环境   调用main方法。您还需要维持该州   通过设置isExecuting和等属性来设置NSOperation   isFinished。简而言之,并发操作可以为您提供更多帮助   控制,但也需要更多的努力 - 大多数任务非并发   操作就够了。

1 个答案:

答案 0 :(得分:9)

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

With synchronous objects:

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

With asynchronous objects:

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