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