2011-12-19 83 views
3

我试图开发一款游戏,并运行到NSTimer的一个小问题,一旦精灵出现在我的场景中有一定的时间在淡出之前。NSTimer立即开火

double CALC_TIME = 5; 
[NSTimer scheduledTimerWithTimeInterval:CALC_TIME target:self selector:@selector(hideSprite) userInfo:nil repeats:NO]; 

我想在5秒后调用hideSprite,而是立即调用它(或接近即时)。

一个可能的解决方案: 我知道我可以设置定时复读,并具有设置第一次,然后下一个间隔的衰落做了布尔华美通为此,计时器是无效的,但我不要认为这是很好的做法

像这样:

bool firstCall = false; 
-(void)hideSprite{ 
     if(!firstCall){ 
     firstCall = true 
    }else{ 
     //fade out sprite 
     //Invalidate NSTimer 
     //firstCall = false; 
    } 
} 

感谢您的帮助!

+2

这应该有效。还有其他的错误 - 你确定'hideSprite'没有被其他代码调用吗?就像一些测试代码在计时器设置完成后立即仍然留在那里一样? – 2011-12-19 21:40:05

+0

不,我刚刚在那里检查,该方法只从一个地方调用, 我添加了一个NSLog,一个在我初始化该方法之后,另一个在它调用的方法中。 保持输出: _2011-12-19 21:43:11.547挤流EM [14144:10a03]计时器调用 2011-12-19 21:43:11.562挤流EM [14144:10a03],叫做定时器 2011-12-19 21:43:16.582 Squish Em [14144:10a03]计时器被叫做 2011-12-19 21:43:16.596 Squish Em [14144:10a03]叫做Timer_ – Rich 2011-12-19 21:44:40

回答

2

我怀疑别的东西叫hideSprite。您所写的代码导致计时器在调用选择器hideSprite之前等待五秒钟。

向定时器提供一个不同的选择器(写一个新的测试方法,它只是做一个NSLog),看看会发生什么。这会告诉你a)计时器是否确实立即发射,b)如果有其他事情正在呼叫hideSprite

[NSTimer scheduledTimerWithTimeInterval:CALC_TIME target:self selector:@selector(testTimer) userInfo:nil repeats:NO]; 

-(void) testTimer { NSLog(@"Timer - and only the timer - called me."); } 
-(void) hideSprite { 
    NSLog(@"I definitely wasn't called by the timer."); 
} 
+0

我做了这个,很奇怪,它开始调用这个方法五秒钟后,我改回它,现在它运行正常,但我不知道为什么......谢谢你的帮助,但时间看我的代码和看看发生了什么! – Rich 2011-12-19 21:58:41

+2

啊,gremlins。他们是真实的,你知道:) – 2011-12-19 22:03:10

0

考虑使用initWithFireDate:interval:target:selector:userInfo:repeats方法初始化您的计时器。这里是更详细的看NSTimer

+0

你能解释一下为什么你认为这会有帮助吗? ?使用这种方法意味着计算一个启动日期而不是仅仅使用一个时间间隔,并且还会对定时器的内存管理产生更多的关注。 – 2011-12-19 21:43:14

1

常常很容易,只需使用类似

[UIView animateWithDuration: 0 delay: 5 options:0 animations: nil completion: 
^{ 
    // fade sprite 
}]; 

(不知道animations可以是零,但你的想法)。

+0

虽然这是解决问题的一种明智方式,但仅仅使用动画才能触发具有一定延迟的方法是不正确的。 – FormigaNinja 2016-02-23 02:22:07