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

时间:2015-01-23 22:09:17

标签: objective-c methods timer sprite-kit

我尝试实现一种在点击屏幕时在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];
    }
}

4 个答案:

答案 0 :(得分:3)

执行此操作的一种方法是增强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
}

答案 1 :(得分:0)

如果我正确理解你的问题并且你试图阻止在每2秒内更频繁地调用touchesBegan中的代码,你可以添加一个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,我希望它没问题。

答案 2 :(得分:0)

sprite-kit的替代方法。

int i;

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

答案 3 :(得分:-2)

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