Ios 延迟objective-c中的方法调用

Ios 延迟objective-c中的方法调用,ios,objective-c,Ios,Objective C,我知道这可以通过使用: [self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0] 但是,问题是我只希望完成一个方法调用。 使用此函数,调用将堆叠在彼此的顶部。我想打个电话,如果再打一个电话,第一个电话就会被解雇。想法?在Xcode中的代码段库中,您可以找到一个名为GCD:Dispatch After的代码段,如下所示: double delayInSeconds = 2.0; dispatch_time_t

我知道这可以通过使用:

[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]
但是,问题是我只希望完成一个方法调用。
使用此函数,调用将堆叠在彼此的顶部。我想打个电话,如果再打一个电话,第一个电话就会被解雇。想法?

在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#>
});
double delayUnseconds=2.0;
dispatch_time_t popTime=dispatch_time(dispatch_time_NOW,(int64_t)(DelayUnseconds*NSEC_PER_SEC));
调度\u after(popTime,调度\u get\u main\u queue(),^(void){
});

非常不言自明。

您应该在其他线程中执行此选择器,以避免按要求进行堆栈。 使用


在该选择器中,您可以根据需要添加延迟。由于此进程将在单独的线程中运行,因此不会因延迟而停止其他进程编辑:现在我知道您只想使用最新的线程,您可以使用:

[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;

一旦该方法正在执行,就无法停止它

但如果它没有被触发,你可以取消。你可以这样做

//.... your code
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil];
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0];
//.... your code

这样,只有在未触发
myMethod
时,您才能取消上一次执行请求。

performSelector:withObject:afterDelay:
只执行一次选择器。我看不出您的问题是什么。您是否尝试调用多个
执行
,然后只执行最新的一个?是的,Inder。这正是我想要做的。对不起,不清楚。+1这正是我要找的。这个实现非常好,因为您可以进行完整的方法调用,即使它们有多个参数,而且看起来很不错。另外,正如您所说,对于编码人员和任何后续开发人员来说,这是不言而喻的。我完全可以将您的提示用于增量按钮集(此处:向上和向下),该按钮集不应立即将其值集转移到硬件。每次点击都会重置计时器,直到最后一次点击触发最终值。
//.... your code
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil];
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0];
//.... your code