如何在调用方法后实现延迟?

How to implement delay after calling a method?

我正在尝试实现一种在我点击屏幕时在 touchesBegan 方法中调用的方法。如何添加延迟,使方法 increment 有 2 秒的停机时间才能再次调用?

int i;
-(void)increment
{
     i++;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */
for (UITouch *touch in touches) {

    CGPoint location = [touch locationInNode:self];
    [self increment];
    }
}

所以我认为您可以使用像 CoreData 这样的临时数据存储。但这在您的情况下没有必要。 PList 或 NSUserDefault 是存储缓存值或数据类型的更好方法。 在你的方法中存储最后 2 秒之后创建一个 "if condition" 并且你可以指定带有延迟的 NSTimer 方法。

如果我正确理解你的问题并且你试图阻止调用 touchesBegan 内部代码的频率超过每 2 秒一次,你可以添加一个 NSDate 变量并在代码执行时将其设置为当前日期。然后添加类似

的内容
if NSDate().timeIntervalSinceDate(timeStamp) > 2 {
    // execute your code
    for touch in touches {

         var location = touch... 
         increment()
        }
    }
    timeStamp = NSDate() // wait period starts again

}

例子在Swift,不是Objective C,希望没问题

实现此目的的一种方法是增强您的 increment 方法,使其仅在 2 秒过去后才执行其常规功能,这是使用 bool 变量验证的。

示例:

BOOL incrementMethodLocked = NO;

-(void)increment
{

     if(incrementMethodLocked)
     return;

     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{

          incrementMethodLocked = NO; // unlocks method for future use
     });

     i++;
     incrementMethodLocked = YES; // locks method
}

sprite-kit 的替代方法。

int i;

-(void)increment
{
     [self runAction:[SKAction sequence:@[[SKAction waitForDuration:2.0], [SKAction runBlock:^{
        i++;
    }]]]];
}