我现在添加了一个更简洁的答案,暂时留下这个,因为它是讨论的一部分......
isConcurrent
好的,直到今天我对使用该方法感到非常满意!
我读了一句话:
在 OS X v10.6 及更高版本中,操作队列忽略此方法返回的值,并始终在单独的线程上启动操作。
作为与 QA1712 相关的警告,指出对于并发操作,该start
方法现在可以在与排队操作的线程不同的线程上调用,这是 10.6 和 iOS 4 中的更改。
我没有读到这表明该isConcurrent
方法被队列完全忽略并且根本没有任何目的,只是它不再影响start
被调用的线程。我可能误解了这一点。
我还将原始问题误解为关于并发操作和isConcurrent
标志的更普遍的问题,而接受的答案实际上是在说
isConcurrent
从 10.6 和 iOS 4 开始可以忽略该标志
我不确定这是否正确。
如果我现在理解原来的问题,可以解释一下:
给定一个正确构建的并发NSOperation
,isConcurrent
标志本身是否真的改变了操作的执行?
我想很难说所有可能的设置,但我们可以这样说:
它没有被弃用。Apple 弃用不再有用的方法是正常的。
文档一致地提到该方法是必需的覆盖。
也许isConcurrent
已被有效弃用,但由于它只是一个BOOL
标志,因此在文档中弃用它可能不值得。或者它现在什么都不做,但 Apple 保留了它以备将来使用,并希望您按照描述覆盖它。
我创建了一个快速测试项目,该项目被NSOperation
覆盖,isConcurrent
并且在任何阶段都没有被调用。这是一个非常简单的测试。我想你可能也测试过它?我假设如果没有将其称为可能的默认实现。main
isConcurrent
NSOperationQueue
NSOperation's
start
那么,我们将何去何从?显然,实施它并返回YES
以满足记录的要求是没有问题的。然而,从我的角度来看,我认为从关于 10.6 和 iOS 4.0 的警告说现在可以安全地忽略它是一个太大的飞跃。
我的原始答案...
isConcurrent
不是遗留方法,也不会被NSOperationQueue
. 其他答案中引用的文档有点不清楚,很容易被误解。
isConcurrent = YES
表示操作提供了自己的并发方式。或者换句话说,操作"isAlreadyConcurrent"
并不需要NSOperationQueue
提供和管理并发。由于NSOperationQueue
不再提供并发性,您需要告诉它何时操作isFinished
或是否isCancelled
(等)因此需要覆盖这些方法。
一个常见的例子是NSOperation
管理NSURLConnection
. NSURLConnection
有自己的后台运行机制,所以不需要由NSOperationQueue
.
那么一个明显的问题是:“为什么将已经并发的操作放入一个NSOperationQueue
?” 这样操作可以从NSOperationQueue
类似依赖项等的其他功能中受益。
文档的误导部分仅指调用start
an 方法的线程NSOperation
。该更改导致了 QA1712 中讨论的问题。