gpt4 book ai didi

iphone - 如何在与操作相同的线程中取消 NSOperation?

转载 作者:行者123 更新时间:2023-11-28 19:20:48 40 4
gpt4 key购买 nike

当我取消 NSOperation 时(当用户按下按钮时)从主线程调用取消方法,但显然该操作正在另一个线程中运行。因此,为了避免在我更改 _isExecuting 和 _isFinished 时出现竞争情况,我认为取消(或至少它的逻辑)应该从与 NSOperation 相同的线程中调用。除此之外,当用户取消它时,几个文件将被删除并且需要时间。因为 cancel 是从主线程调用的,所以所有的应用程序都会在一段时间内变得无响应,这很丑陋。

如何在与当前 NSOperation 相同的线程中执行取消代码?

我在取消中尝试了这个(类似于我在 ASIHTTPRequest 中看到的):

if (_operationThread) {
[self performSelector:@selector(cancelOnRequestThread) onThread:_operationThread withObject:nil waitUntilDone:NO];
} else {
[self cancelOnRequestThread];
}

并且 _operationThread 在 start 方法中使用:_operationThread=[NSThread 当前线程];

但它不起作用。

有什么想法或建议吗?

注意:我用的是并发操作,所以我用的是start而不是main。

非常感谢您的帮助。里卡多。

最佳答案

可以从主线程调用 NSOperation 上的取消。 cancel 方法是线程安全的。

这不应该在您的主线程上造成任何阻塞,因为 cancel 方法本身不应该做任何工作。如果您重写了删除文件等操作的取消方法,那么这是错误的方法。您不应该重写取消方法,而只是在操作的主要方法中的常规点检查 isCancelled 方法(例如,在任何紧密循环内),然后如果 isCancelled 返回 YES,则尽早从 main 返回,这将取消相同的操作线程作为执行的其余部分。

如果这就是您已经实现的方式并且您仍然遇到性能问题,是否有可能您的操作根本没有真正在后台线程上运行?例如,如果您已将它添加到 [NSOperationQueue mainQueue] 返回的队列中,那么它实际上是在主应用程序线程上运行。

关于iphone - 如何在与操作相同的线程中取消 NSOperation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8989642/

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