如何阻止目前的NSOperation?

时间:2011-10-19 12:00:44

标签: objective-c macos cocoa nsoperation nsoperationqueue

我正在使用NSOperationQueueNSOperation在后​​台点击上运行某些功能。 但是我希望能够在用户点击某个按钮时停止该操作。

我该怎么做?

类似的事,[currentoperation stop];
Cancel - 不会对我有用。我想立即停止。

由于

3 个答案:

答案 0 :(得分:15)

您应该调用-cancel方法,并且操作本身必须支持通过监视isCancelled属性/ keypath来取消,并在其值变为YES时安全停止。如果NSOperation是您自己的,您可能必须创建自定义子类来实现此功能。您不能(安全地)强制任意操作立即停止。它必须支持被取消。

答案 1 :(得分:8)

使用Apple提供的任何内容NSOperation,您无法立即停止。您可以像其他人在此处所建议的那样使用-[cancel],但当前操作仍会一直运行直到完成。在您的操作中接近使用-[isCancelled]的一种方法是在整个代码中使用它(特别是在长时间运行的循环中)。类似的东西:

- (void)main {
    // do a little work
    if ([self isCancelled]) { return; }

    // do a little more work
    if ([self isCancelled]) { return; }
}

这样你就可以很快停止。

如果您希望真正强制线程停止,您可能需要研究信号处理。有一个threaded example here。将定制信号发送到特定线程,您可以以某种方式终止该线程。然而,这将是一项更多的工作,并且可能比它的价值更麻烦。

答案 2 :(得分:1)

您使用cancel,并测试selfNSOperation)是否在执行期间被取消。