在objective-c中延迟方法调用

时间:2013-03-19 10:25:04

标签: ios objective-c

我知道这可以通过使用:

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

然而,问题是我只想做一个方法调用。 使用此功能,呼叫将叠加在一起。我想拨打电话,如果再打电话,第一个电话将被解雇。想法?

4 个答案:

答案 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;