我知道这可以通过使用来完成:
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]
但是,问题是我只想完成 1 个方法调用。使用此函数,调用将相互堆叠。我想打个电话,如果打另一个电话,第一个电话将被驳回。想法?
我知道这可以通过使用来完成:
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]
但是,问题是我只想完成 1 个方法调用。使用此函数,调用将相互堆叠。我想打个电话,如果打另一个电话,第一个电话将被驳回。想法?
一旦方法执行,就无法停止它。
但如果它没有被解雇,你可以取消。你可以做这样的事情
//.... your code
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil];
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0];
//.... your code
这样,只有在myMethod
没有被触发的情况下,您才能取消先前的执行请求。
在 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#>
});
很不言自明。
您应该在其他线程中执行此选择器以避免您要求的堆栈。利用
[self performSelector:(SEL) onThread:(NSThread *) withObject:(id) waitUntilDone:(BOOL)];
在该选择器中,您可以随心所欲地添加延迟。由于此进程将在单独的线程中运行,因此不会因为延迟而停止其他进程
编辑:现在我知道您只想使用最新的,您可以改用:
[self cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil];
有关更多信息,请参阅此链接。
原帖:
您可以只设置一个 BOOL,当它到达该部分时设置为 NO,然后在执行该方法后重置为 YES。
因此,例如,它看起来像:
if (boolVal) {
boolVal = NO;
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0];
}
然后在你的 myMethod 中,有:
boolVal = YES;