2010-07-25 86 views
3

如何取消Objective-C中的后台线程?取消Objective-C中的后台线程

我打电话后台线程像这样:

[self performSelectorInBackground:@selector(setupThumbnails) withObject:nil]; 

当刷卡时,对于每刷卡我想取消先前的后台线程请求调用它。

回答

2

维护线程的取消属性,并在线程中定期检查它。您需要使用锁或原子函数(由操作系统及其框架提供,而不是自己实现!)来指示线程应该被取消。系统提供的原子功能记录在atomic联机帮助页中。

更好的办法是在NSOperationQueue上使用NSOperation而不是NSThread。它仍然会使用线程在后台执行工作,但它可以让框架和操作系统代表您管理线程池,而NSOperation本身有一个可以检查的isCancelled属性 - 以及取消单个NSOperation或者整个NSOperationQueue中的所有操作。

例如,您可以“设置一个缩略图”操作,然后将一个此类操作添加到每个要设置的缩略图的队列中。操作系统和框架将合作管理用于执行这些操作的线程数量,但您也可以设置队列的宽度以确保只有最多一次运行多个导入。如果用户取消,则可以要求队列取消所有未完成的操作。