来自后台线程问题的cancelPreviousPerformRequests

时间:2011-09-28 18:09:21

标签: iphone objective-c ipad

我有以下代码,按下按钮时执行:

 [self performSelector:@selector(timeout:) withObject:nil afterDelay:30.0];

当我想从后台线程取消此问题时,会出现问题:

[NSObject cancelPreviousPerformRequestsWithTarget:self];

我做了这个并没有取消,它仍然在30秒后调用超时。所以我的问题是,有没有办法从后台线程取消这个?

2 个答案:

答案 0 :(得分:1)

documentation,'此方法仅在当前运行循环中删除执行请求,而不是所有运行循环。这意味着您必须在主线程上调用cancelPreviousPerformRequestsWithTarget。使用performSelectorOnMainThread:withObject:waitUntilDone:从你的线程调度主线程上的cancelPreviousPerformRequestsWithTarget调用。

这是一种迂回的做事方式,但应该有用。

编辑以显示示例:

最简单的方法是使用辅助方法:

-(void)cancelTimeout
{
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
}

然后在你的后台线程上,当你想取消超时时调用它:

[self performSelectorOnMainThread:@selector(cancelTimeout) withObject:nil waitUntilDone:NO];

答案 1 :(得分:0)

您可以使用NSTimer在一段时间后调用方法,如果需要则使用