2

我正在阅读NSOperationQueue博客和文档。

NSOperationQueue我们可以通过setMaxConcurrentOperationCount属性设置并发操作的数量。

我的疑问是如果我使用setMaxConcurrentOperationCount =1then,这意味着我的队列一次只能执行一个任务。那么并发是什么意思,它变成了单线程执行。

请告诉我,如果我解释错误的意思。

4

3 回答 3

5

是的,它一次只会执行一项任务。在某些情况下,一次设置一个是有意义的。例如,下载照片并对其应用过滤器。从您的角度来看,最好一次下载一个,应用过滤器并存储/显示它。正如乔纳森在评论中添加的那样:

而不是设置 maxConcurrentOperationCount=1。您可以使一个操作依赖于另一个基本上具有相同效果的操作的完成。例如,A 依赖于 B,但要确保 B 不依赖于 A。

setMaxConcurrentOperationCount =1对这种东西很好:

[myOperationQueue setMaxConcurrentOperationCount:1];
for (NSOperation *operation in myArrayOfOperations )
{
   [myOperationQueue addOperation:operation];
}

因此,您在循环中添加新操作,但它们将在串行队列中运行。尽管如此,从文档中:

操作队列根据其优先级和准备情况执行其排队的操作对象。如果所有排队的操作对象具有相同的优先级并且在它们被放入队列时准备好执行——也就是说,它们的 isReady 方法返回 YES——它们将按照它们提交到队列的顺序执行。对于最大并发操作数设置为 1 的队列,这等同于串行队列。但是,您永远不应该依赖操作对象的串行执行。操作准备情况的更改可能会更改生成的执行顺序。

于 2013-10-28T13:58:07.427 回答
0

意味着队列中的操作是一个一个地执行的,当一个完成后另一个可以开始,所以选择 1 你的队列是一个 SERIAL 队列

于 2013-10-28T13:54:27.067 回答
0

将 maxConcurrentOperationCount 设置为 1 可以有效地将 NSOperation 队列更改为串行队列,因此您可以避免并发问题,但代价是一次只执行一项任务。

但是,您可以拥有任意数量的 NSOperationQueue。并且 maxConcurrentOperationCount = 1 的十几个 NSOperationQueue 可以同时运行任务,如果有的话,可以使用十几个内核。唯一的限制是每个队列中只能运行一个任务。

于 2014-07-25T14:56:33.217 回答