来自:Apple docs on managing concurrency:
的NSOperation
编写自定义子类并覆盖一个方法:main。当NSOperationQueue计划运行时,调用main方法执行操作。以这种方式编写的NSOperation类称为非并发操作,因为开发人员不负责生成线程 - 多线程全部由超类处理。 (不要被术语混淆:仅仅因为操作是非并发的,并不意味着它不能同时执行,它只是意味着你不必自己处理并发。)
我认为覆盖main是最简单的使用NSOperation
的方法,但苹果站点说它的非并发意味着nsoperation队列中的nsoperations(当只覆盖main时)会串行执行吗?
我不想以串行方式执行我的操作,但我希望尽可能少地将操作并行。
答案 0 :(得分:1)
不,他们不会必然连续运行。正如您引用的段落所指出的那样,“并不意味着它不能同时执行”。
那么是什么决定它们是否可以并行运行? 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);