Ios isConcurrent对于从NSOperationQueue运行的NSOperation意味着什么?
因为Ios isConcurrent对于从NSOperationQueue运行的NSOperation意味着什么?,ios,nsoperation,nsoperationqueue,Ios,Nsoperation,Nsoperationqueue,因为NSOperationQueue总是在新线程上运行任务, 当NSOperation从NSOperationQueue运行时,我对isConcurrent的角色感到困惑 如果我有两个子类NSOperation,它们都运行异步进程,都是从NSOperationQueue启动的,并且在这两个子类中,我覆盖isCancelled,isExecuting,isFinished和isReady。 如果其中一个我覆盖isConcurrent始终返回YES而另一个总是返回NO,会有什么区别 谁真正调用了is
NSOperationQueue
总是在新线程上运行任务,
当NSOperation
从NSOperationQueue
运行时,我对isConcurrent
的角色感到困惑
如果我有两个子类NSOperation
,它们都运行异步进程,都是从NSOperationQueue
启动的,并且在这两个子类中,我覆盖isCancelled
,isExecuting
,isFinished
和isReady
。
如果其中一个我覆盖isConcurrent
始终返回YES
而另一个总是返回NO
,会有什么区别
谁真正调用了
isConcurrent
?如果是NO
或YES
则逻辑如何变化这是一种遗留方法,在OS X v10.6之前和iOS 4之前使用,即在推出用于NSOperationQueue
调度的GCD之前
从
操作队列通常提供用于运行其操作的线程。在OS X v10.6及更高版本中,操作队列使用libdispatch
库(也称为Grand Central Dispatch)启动其操作的执行。因此,无论操作被指定为并发操作还是非并发操作,操作总是在单独的线程上执行但是,在OS X v10.5中,只有当操作的isConcurrent
方法返回NO
时,操作才会在单独的线程上执行。如果该方法返回YES,则操作对象将创建自己的线程(或启动一些异步操作);队列没有为其提供线程
如果您正在运行OS X>=10.6或iOS>=4,则可以安全地忽略它
作为对这一事实的确认,从
在OS X v10.6及更高版本中,操作队列忽略此方法返回的值,并始终在单独的线程上启动操作
我现在添加了一个更简洁的答案,暂时将此作为讨论的一部分
好的,直到今天,我对使用
isConcurrent
方法还是很满意的
我读了这句话:
在OS X v10.6及更高版本中,操作队列忽略
此方法并始终在单独的线程上启动操作
作为与QA1712相关的警告,指出对于并发操作,start
方法现在可以在不同于排队操作的线程上调用,这是10.6和iOS 4中的一个更改
我并没有将此理解为表示队列完全忽略了isConcurrent
方法,完全没有任何用途,只是它不再影响调用start
的线程。我可能误解了这一点
我还将最初的问题误解为关于并发操作的更一般的问题,isConcurrent
标志,而公认的答案实际上是这样说的
从10.6版和iOS 4版开始,isConcurrent
标志可以忽略
我不确定这是否正确
如果我现在理解了原来的问题,可以这样解释:
如果正确构建了并发的NSOperation
,isConcurrent
标志本身是否确实改变了操作的执行
我想很难说所有可能的设置,但我们可以说:
isConcurrent
实际上已被弃用,但由于它只是一个BOOL
标志,也许不值得在文档中大力弃用它。或者它现在什么也不做,但苹果保留了它,以备将来可能使用,并希望您按照描述覆盖它
我创建了一个快速测试项目,其中有一个NSOperation
,它只覆盖了isConcurrent
和main
,在任何阶段都没有调用isConcurrent
。这是一个非常简单的测试。我想你可能也测试过了?我假设如果NSOperationQueue
没有调用NSOperation的start
的默认实现,可能会发生这种情况
那我们该怎么办?显然,实现它并返回YES
以满足文档化的需求并不麻烦。然而,从我的角度来看,我认为从10.6和iOS 4.0的告诫出发,说现在可以安全地忽略它是一个很大的飞跃
我的原始答案…
isConcurrent
不是传统方法,并且不会被NSOperationQueue
忽略。其他答案中引用的文档有点不清楚,容易被误解
isConcurrent=YES
表示操作提供自己的并发方式。或者换句话说,操作“是alreadyconcurrent”
,不需要NSOperationQueue
来提供和管理并发性。由于NSOperationQueue
不再提供并发性,您需要在操作完成时告诉它,或者如果操作被取消时告诉它(等等),因此需要覆盖这些方法
一个常见的例子是管理nsurl连接的NSOperation
NSURLConnection
有自己的后台运行机制,因此不需要通过NSOperationQueue
使其并发
一个明显的问题是:“为什么要将一个已经并发的操作放入NSOperationQueue
?”这样操作就可以从NSOperationQueue
的其他特性(如依赖项等)中获益