我正在阅读NSOperationQueue
博客和文档。
我们可以通过NSOperationQueue
属性设置setMaxConcurrentOperationCount
中的并发操作数。
我的疑问是,如果我正在使用setMaxConcurrentOperationCount =1
那么,这意味着我的队列一次只能执行单个任务。那么并发的含义是什么,它就变成了单线程执行。
请告诉我,如果我解释错误的含义。
答案 0 :(得分:4)
是的,它一次只能执行一项任务。有些情况下,一次设置一个是有意义的。例如,下载照片并对其应用过滤器。从您的角度来看,最好一次下载一个,应用过滤器并存储/显示它。正如乔纳森在评论中所说:
而不是设置maxConcurrentOperationCount = 1。你可以做一个 操作依赖于另一个操作的完成 基本上具有相同的效果。例如。 A取决于B,但请确保B. 不依赖于A.
setMaxConcurrentOperationCount =1
很适合这种东西:
[myOperationQueue setMaxConcurrentOperationCount:1];
for (NSOperation *operation in myArrayOfOperations )
{
[myOperationQueue addOperation:operation];
}
因此,您在循环中添加新操作,但它们将在串行队列中运行。不过,来自documentation:
操作队列基于执行其排队的操作对象 他们的优先事项和准备就绪如果所有排队的操作对象 具有相同的优先级,并准备好在它们被放入时执行 队列 - 也就是说,他们的isReady方法返回YES-它们被执行 按照它们提交到队列的顺序。对于队列 其最大并发操作数设置为1 等同于一个串行队列。但是,你永远不应该依赖 连续执行操作对象。准备就绪的变化 操作可以改变生成的执行顺序。
答案 1 :(得分:0)
意味着队列中的操作是逐个执行的,当一个完成另一个操作可以启动时,所以选择你的队列是一个SERIAL队列
答案 2 :(得分:0)
将maxConcurrentOperationCount设置为1可以有效地将NSOperation队列更改为串行队列,因此可以避免以一次执行一个任务为代价的并发问题。
但是你可以拥有任意数量的NSOperationQueues。并且十几个具有maxConcurrentOperationCount = 1的NSOperationQueues可以同时运行任务,如果有的话可以使用十几个核心。唯一的限制是每个队列中只能运行一个任务。