performSelector NSThread问题

时间:2011-03-16 11:19:38

标签: iphone objective-c nsthread

是否可以在performSelector waitsUntilDone中取消线程?

见下文:

我有一个带有以下行的while循环:

[self performSelector:@selector(getMyRecords:) onThread:myThread withObject:i waitUntilDone:YES]

有时,我需要在循环执行时取消我的线程myThread。我遇到了崩溃问题:

Terminating app due to uncaught exception 'NSDestinationInvalidException', reason: '*** -[MyController performSelector:onThread:withObject:waitUntilDone:modes:]: target thread exited while waiting for the perform'

3 个答案:

答案 0 :(得分:0)

如果你在一个线程中有一个长时间运行的操作,你可以声明一个条件变量(原子),如'cancelled'并检查它。 类似的东西:

- (void) threadFunc {
 while (!canceled){
   // do stuff
 }
}


- (void) cancelThread {
 canceled = true;
}

答案 1 :(得分:0)

我认为最简单的方法是使用NSThread's -(void)cancel方法。

答案 2 :(得分:-1)

查看NSObject的文档:

  

此方法将消息排入队列   使用运行目标线程的循环   默认的运行循环模式 - 即   与之相关的模式   NSRunLoopCommonModes常量。作为一部分   它的正常运行循环处理,   目标线程使消息出列   (假设它在其中一个中运行   默认运行循环模式)并调用   理想的方法。

     

您无法取消排队的邮件   使用这种方法。如果你想要的话   取消消息的选项   当前线程,您必须使用其中一个   该   performSelector:withObject:afterDelay:   要么   performSelector:withObject:afterDelay:inModes:   方法

     

此方法保留接收器和   直到之后的arg参数   选择器已执行。