NSOperation,start vs main

Ans*_*shu 10 nsoperation nsoperationqueue

根据Apple关于NSOperation的文档,我们必须覆盖main非并发操作的start方法和并发操作的方法.但为什么?

Rob*_*ier 23

首先,请记住,"并发"和"非并发"具有某些特殊含义,NSOperation因为它们往往会使人感到困惑(并且与"异步/同步"同义使用)."并发"意味着"操作将管理自己的并发和状态." "非并发"意味着"操作需要其他东西,通常是队列,来管理其并发性,并希望默认状态处理."

start执行所有默认状态处理.部分原因是它设置isExecuting,然后调用main,何时main返回,它清除isExecuting并设置isFinished.由于您正在处理自己的状态,因此您不希望这样(您不希望退出main以完成操作).所以你需要实现自己start而不是调用super.现在,main如果你愿意的话,你仍然可以拥有一个方法,但由于你已经覆盖了start(这就是调用main),大多数人只是将所有代码放入其中start.

作为一般规则,不要使用并发操作.它们很少是你的意思.他们绝对不是指"在后台运行的东西".这两种操作都可以在后台运行(也不具有在后台运行).问题是您是否需要默认系统行为(非并发),或者您是否想要自己处理所有内容(并发).

如果你自己处理它的想法是"旋转一下NSThread",你几乎肯定做错了(除非你这样做是为了与需要它的C/C++库接口).如果它正在创建一个队列,你可能做错了(NSOperation有各种功能来避免这种情况).如果几乎任何看起来像"在后台手动处理事情"的事情,你可能做错了.默认(非并发)行为几乎肯定比你要做的更好.

并发操作可能有用的地方是您正在使用的API已经为您处理并发.main返回时,非并发操作结束.那么如果你的操作包含异常的东西NSURLConnection呢?处理这种情况的一种方法是使用一个调度组,然后dispatch_wait在你的结尾调用,main所以它不会返回,直到完成所有操作.没关系.我一直这样做.但是,块,不会被阻止的线程,浪费了一些资源,在一些复杂的边界情况可能导致死锁(精细.苹果声称这是可能的,他们已经看到了它,但我从来没有能够甚至故意让它发生).

所以另一种方法是将自己定义为并发操作,并isFinishedNSURLConnection委托方法中手动设置.如果您正在包装其他异步接口(如Dispatch I/O),则会发生类似情况,并且并发操作可能更有效.

(理论上,当你想在不使用队列的情况下运行操作时,并发操作也很有用.我可以想象一些非常复杂的情况,这是有道理的,但它是一个延伸,如果你在那条船,我假设你知道你在做什么.)

但是如果你有任何问题,只需使用默认的非并发行为.你几乎总是可以得到你想要少麻烦(尤其是如果你使用一个调度组)这样的行为,然后你不必环绕"并发"在文档中有些混乱的解释你的大脑.


gna*_*729 0

我认为并发与非并发不仅仅是某个地方的标志,而是一个非常实质性的区别。通过使用两种不同的方法,可以绝对确保您不会在应该使用非并发操作的地方使用并发操作,反之亦然。

如果你弄错了,你的代码绝对不会因为这种设计而工作。这就是您想要的,因为您可以立即修复它。如果只有一种方法,那么使用并发而不是非并发将导致非常微妙的错误,而且可能很难发现。非并发而不是并发会导致您也可能会错过的性能问题。