我有以下代码,按下按钮时执行:
[self performSelector:@selector(timeout:) withObject:nil afterDelay:30.0];
当我想从后台线程取消此问题时,会出现问题:
[NSObject cancelPreviousPerformRequestsWithTarget:self];
我做了这个并没有取消,它仍然在30秒后调用超时。所以我的问题是,有没有办法从后台线程取消这个?
答案 0 :(得分:1)
从documentation,'此方法仅在当前运行循环中删除执行请求,而不是所有运行循环。这意味着您必须在主线程上调用cancelPreviousPerformRequestsWithTarget。使用performSelectorOnMainThread:withObject:waitUntilDone:从你的线程调度主线程上的cancelPreviousPerformRequestsWithTarget调用。
这是一种迂回的做事方式,但应该有用。
编辑以显示示例:
最简单的方法是使用辅助方法:
-(void)cancelTimeout
{
[NSObject cancelPreviousPerformRequestsWithTarget:self];
}
然后在你的后台线程上,当你想取消超时时调用它:
[self performSelectorOnMainThread:@selector(cancelTimeout) withObject:nil waitUntilDone:NO];
答案 1 :(得分:0)
您可以使用NSTimer在一段时间后调用方法,如果需要则使用