gpt4 book ai didi

NSOperation,开始与主

转载 作者:行者123 更新时间:2023-12-04 02:51:59 26 4
gpt4 key购买 nike

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

最佳答案

首先,请记住,“并发”和“非并发”在 NSOperation 中有一些特殊的含义。这往往会使人们感到困惑(并且与“异步/同步”同义使用)。 “并发”是指“操作将管理自己的并发和状态”。 “非并发”是指“操作需要其他东西,通常是队列,来管理它的并发,并且需要默认状态处理。”
start执行所有默认状态处理。部分原因是它设置了isExecuting ,然后调用 mainmain返回,它清除 isExecuting并设置 isFinished .由于您正在处理自己的状态,因此您不希望这样(您不想退出 main 来完成操作)。所以你需要实现自己的start不要调用super .现在,您仍然可以拥有 main方法如果你想,但因为你已经覆盖了start (这就是所谓的 main ),大多数人只是将所有代码放在 start 中.

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

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

在您使用的 API 已经为您处理并发的情况下,并发操作可能会有所帮助。非并发操作在 main 时结束返回。那么如果你的操作包装了一个像 NSURLConnection 这样的异步操作呢? ?一种处理方法是使用调度组,然后调用 dispatch_wait在您的 main 末尾所以在一切完成之前它不会返回。没关系。我一直都这样做。但是它阻塞了一个不会被阻塞的线程,这会浪费一些资源,并且在一些复杂的极端情况下可能会导致死锁(真的很复杂。Apple声称这是可能的,他们已经看到了,但我从来没有能够让它发生,即使是故意的)。

因此,另一种方法是将自己定义为并发操作,并设置 isFinished手动提交您的NSURLConnection委托(delegate)方法。如果您包装其他异步接口(interface)(如 Dispatch I/O),也会发生类似情况,并且并发操作可能会更有效。

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

但是,如果您有任何疑问,只需使用默认的非并发行为即可。您几乎总是可以轻松地以这种方式获得您想要的行为(尤其是如果您使用调度组),然后您不必将大脑围绕在文档中对“并发”的有些困惑的解释上。

关于NSOperation,开始与主,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38546198/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com