1

来自:Apple docs on management concurrency

Ns操作

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

我认为覆盖 main 是最简单的使用方法NSOperation,但苹果网站说它的非并发是否意味着 nsoperation 队列中的 nsoperations(仅覆盖 main 时)将连续执行?

我不想连续执行我的操作,但我希望以尽可能少的努力让我的操作并行。

4

2 回答 2

1

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

那么是什么决定了它们是否可以并行运行呢?NSOperationQueue您在操作之间设置的和任何依赖项。稍后在同一份文档中,标题为“运行操作”的部分解释了:

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

并发编程指南中详细说明:

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

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

于 2012-11-28T07:05:11.970 回答
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);
于 2012-11-28T07:03:22.437 回答