【问题标题】:NSTimer firing instantlyNSTimer 立即触发
【发布时间】:2011-12-19 21:23:32
【问题描述】:

我正在尝试开发一款游戏,但遇到了 NSTimer 的一个小问题,一旦精灵出现,它就会在我的场景中出现一定的时间,然后淡出。

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

我希望在 5 秒后调用 hideSprite,但它会立即调用(或接近即时)。

一种可能的解决方案: 我知道我可以通过将计时器设置为重复来做到这一点,并且第一次设置一个 bool firstCall,然后在下一个间隔完成淡化,计时器无效,但我认为这不是一个好习惯

像这样:

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

感谢您的帮助!

【问题讨论】:

  • 这应该可以。还有其他问题 - 您确定 hideSprite 没有被任何其他代码调用吗?像一些测试代码在定时器设置后仍然留在里面吗?
  • 不,我刚刚检查了那里,该方法只从一个地方调用,我添加了一个 NSLog,一个在我初始化方法之后,一个在方法中调用。保持输出:2011-12-19 21:43:11.547 Squish Em[14144:10a03] Timer Called 2011-12-19 21:43:11.562 Squish Em[14144:10a03] Called Timer 2011-12-19 21:43:16.582 Squish Em[14144:10a03] 调用定时器 2011-12-19 21:43:16.596 Squish Em[14144:10a03] 调用定时器

标签: iphone objective-c nstimer


【解决方案1】:

我怀疑有别的东西在打电话给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.");
}

【讨论】:

  • 我这样做了,奇怪的是它在五秒钟后开始调用这个方法,我把它改回来,现在它运行正常,但我不知道为什么......谢谢你的帮助,是时候看看我的代码,看看发生了什么!
  • 啊,小鬼。它们是真实的,你知道 :)
【解决方案2】:

通常使用类似的东西会更容易

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

(不确定animations 是否可以为 nil,但你明白了)。

【讨论】:

  • 虽然解决问题的方法很聪明,但是仅仅为了触发某个方法而使用动画有一定的延迟是不正确的。
【解决方案3】:

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

【讨论】:

  • 您能解释一下为什么您认为这会有所帮助吗?使用这种方法意味着计算一个触发日期而不是仅仅使用一个时间间隔,并且还会增加对计时器内存管理的关注。
猜你喜欢
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
相关资源
最近更新 更多