如何在操作的同一个线程中取消NSOperation?

时间:2012-01-24 15:43:13

标签: iphone objective-c ios nsoperation nsoperationqueue

当我取消NSOperation(当用户按下按钮时)从主线程调用cancel方法,但显然操作正在另一个线程中运行。 因此,为了在我更改_isExecuting和_isFinished时避免竞争条件,我认为应该从与NSOperation相同的线程调用cancel(或至少它的逻辑)。除此之外,当用户取消它时,删除了几个文件,这需要时间。因为取消是从主线程调用的,所以应用程序暂时没有响应,这很难看。

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

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

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

使用以下命令在start方法中设置_operationThread: _operationThread = [NSThread currentThread];

但它不起作用。

有任何想法或建议吗?

注意:我使用并发操作,因此我使用start而不是main。

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

1 个答案:

答案 0 :(得分:4)

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

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

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