当我取消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。
非常感谢你的帮助。 里卡多。
答案 0 :(得分:4)
可以从主线程调用NSOperation上的取消。 cancel方法是线程安全的。
这不应该对主线程造成任何阻塞,因为cancel方法本身不应该做任何工作。如果你已经覆盖了删除文件等操作的取消方法,那么这是错误的方法。你不应该覆盖cancel方法,而只是在操作的main方法中的常规点检查isCancelled方法(例如在任何紧密循环内),然后如果isCancelled返回YES则从main提前返回,然后取消对该操作的操作线程作为执行的其余部分。
如果您已经实现了它并且仍然存在性能问题,那么您的操作是否可能根本不在后台线程上运行?例如,如果您已将其添加到[NSOperationQueue mainQueue]返回的队列中,那么它实际上正在主应用程序线程上运行。