17

我知道这可以通过使用来完成:

[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]

但是,问题是我只想完成 1 个方法调用。使用此函数,调用将相互堆叠。我想打个电话,如果打另一个电话,第一个电话将被驳回。想法?

4

4 回答 4

23

一旦方法执行,就无法停止它。

但如果它没有被解雇,你可以取消。你可以做这样的事情

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

这样,只有在myMethod没有被触发的情况下,您才能取消先前的执行请求。

于 2013-03-19T10:40:19.040 回答
21

在 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#>
});

很不言自明。

于 2013-03-19T10:27:47.687 回答
2

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

[self performSelector:(SEL) onThread:(NSThread *) withObject:(id) waitUntilDone:(BOOL)];

在该选择器中,您可以随心所欲地添加延迟。由于此进程将在单独的线程中运行,因此不会因为延迟而停止其他进程

于 2013-03-19T10:30:57.393 回答
2

编辑:现在我知道您只想使用最新的,您可以改用:

[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;
于 2013-03-19T10:31:59.500 回答