首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >performSelector NSThread问题

performSelector NSThread问题
EN

Stack Overflow用户
提问于 2011-03-16 19:19:38
回答 3查看 2.3K关注 0票数 1

可以在performSelector waitsUntilDone时取消线程吗?

如下所示:

我有一个while循环,其中包含以下代码行:

代码语言:javascript
复制
[self performSelector:@selector(getMyRecords:) onThread:myThread withObject:i waitUntilDone:YES]

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

代码语言:javascript
复制
Terminating app due to uncaught exception 'NSDestinationInvalidException', reason: '*** -[MyController performSelector:onThread:withObject:waitUntilDone:modes:]: target thread exited while waiting for the perform'
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-16 19:36:31

查看NSObject的文档:

此方法使用默认的运行循环模式(即,与NSRunLoopCommonModes常量关联的模式)在目标线程的运行循环上对消息进行排队。作为其正常运行循环处理的一部分,目标线程将消息出队(假设它正在以默认运行循环模式之一运行),并调用所需的方法。

您不能取消使用此方法排队的消息。如果您需要取消当前线程上的消息的选项,则必须使用performSelector:withObject:afterDelay:或performSelector:withObject:afterDelay:inModes:方法。

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

票数 -1
EN

Stack Overflow用户

发布于 2011-03-16 19:27:05

如果你在一个线程中有一个长时间运行的操作,你可以声明一个条件变量(原子),就像‘取消’,并检查它。类似于:

代码语言:javascript
复制
- (void) threadFunc {
 while (!canceled){
   // do stuff
 }
}


- (void) cancelThread {
 canceled = true;
}
票数 0
EN

Stack Overflow用户

发布于 2011-03-16 19:33:18

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5324526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档