非并发nsoperations是否以串行方式执行?

时间:2012-11-28 06:53:31

标签: objective-c multithreading parallel-processing nsoperation

来自:Apple docs on managing concurrency

  

的NSOperation

     

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

我认为覆盖main是最简单的使用NSOperation的方法,但苹果站点说它的非并发意味着nsoperation队列中的nsoperations(当只覆盖main时)会串行执行吗?

我不想以串行方式执行我的操作,但我希望尽可能少地将操作并行。

2 个答案:

答案 0 :(得分:1)

不,他们不会必然连续运行。正如您引用的段落所指出的那样,“并不意味着它不能同时执行”。

那么是什么决定它们是否可以并行运行? NSOperationQueue以及您在操作系统之间设置的所有依赖关系。稍后在同一文档中,标题为“运行操作”的部分解释了:

  • 您可以指定(限制)队列将产生的线程数,以及
  • “NSOperationQueue将自动确定它应该产生多少个线程。”

Concurrency Programming Guide中详细说明:

  

在大多数情况下,操作在添加到队列后不久执行,但操作队列可能由于多种原因而延迟排队操作的执行。具体而言,如果排队操作依赖于尚未完成的其他操作,则执行可能会延迟。如果操作队列本身被挂起或者已经在执行其最大并发操作数,则执行也可能会延迟。

使用非并发操作放弃的是操作本身并不打算设置新线程等。

答案 1 :(得分:0)

我不确定,但我使用“dispatch_queue_create”来创建并行进程。 假设我想同时做两个功能,我使用以下代码。请看看它是否对您有帮助,

dispatch_queue_t queue = dispatch_queue_create("FirstOperation", 0ul);
dispatch_async(queue, ^{

    //Do your functionality here

    dispatch_sync(dispatch_get_main_queue(), ^{
        //Do your UI updates here
    });
});
dispatch_release(queue);


dispatch_queue_t queue2 = dispatch_queue_create("SecondOperation", 0ul);
dispatch_async(queue2, ^{

    //Do your functionality here

    dispatch_sync(dispatch_get_main_queue(), ^{
        //Do your UI updates here
    });
});
dispatch_release(queue2);