是否可以在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'
答案 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参数 选择器已执行。