我知道这可以通过使用:
来完成[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]
然而,问题是我只想做一个方法调用。 使用此功能,呼叫将叠加在一起。我想拨打电话,如果再打电话,第一个电话将被解雇。想法?
答案 0 :(得分:19)
一旦方法执行,就无法阻止它。
但如果没有被解雇,你可以取消。你可以做这样的事情
//.... your code
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil];
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0];
//.... your code
这样,只有在myMethod
未被解雇时,您才能取消之前的执行请求。
答案 1 :(得分:18)
在Xcode的代码片段库中,您可以找到一个名为GCD:Dispatch After的内容,如下所示:
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
<#code to be executed on the main queue after delay#>
});
非常不言自明。
答案 2 :(得分:2)
你应该在其他一些线程中执行这个选择器,以避免你提出的堆栈。 使用
[self performSelector:(SEL) onThread:(NSThread *) withObject:(id) waitUntilDone:(BOOL)];
在该选择器中,您可以根据需要添加延迟。由于此过程将在单独的线程中运行,因此不会阻止其他人延迟
答案 3 :(得分:2)
[self cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil];
有关详细信息,请参阅this link。
原始邮件:
你可以让BOOL在到达那个部分时设置为NO,然后在执行该方法后重置为YES。
因此,例如,它看起来像:
if (boolVal) {
boolVal = NO;
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0];
}
然后在你的myMethod中,有:
boolVal = YES;