告诉NSTimer不要反复射击

时间:2012-01-24 04:40:40

标签: objective-c

以下仅执行一次。为什么,当重复设置为YES?

NSTimer *timer = [NSTimer timerWithTimeInterval:1/3 target:self 
 selector:@selector(updateThingsRepeatedly:) userInfo:nil repeats:YES];

[timer fire];

如果我理解正确的话,updateThingsRepeatedly方法应该每1/3秒反复调用一次。这不正确吗?

它确实调用方法,但是,并没有像我期望的那样启动循环。

6 个答案:

答案 0 :(得分:6)

1/3评估为0.将其替换为1.0/3.0,您将被设置。

这是处理数字的C方式。您必须提示编译器有关所需的表达式类型。 1/3是整数除法,其结果是整数。 1.0/3.0double1.0f/3.0ffloat。使用强制转换可以达到相同的效果:(double)1/(double)3

NSTimer可以设置为在0秒后触发,这意味着它将在运行循环结束时触发一次。

答案 1 :(得分:6)

您可以使用此方法 -

[NSTimer scheduledTimerWithTimeInterval:1.0/3.0 target:self selector:@selector(updateThings:) userInfo:nil repeats:YES];

如果你正在使用

[NSTimer timerWithTimeInterval:1.0/3.0 target:self 
 selector:@selector(updateThings:) userInfo:nil repeats:YES];

然后你必须将它添加到运行循环中。

讨论

您必须使用addTimer:forMode:将新计时器添加到运行循环中。然后,在经过几秒钟后,计时器将触发,调用调用。 (如果计时器配置为重复,则无需随后将计时器重新添加到运行循环中。)

添加运行循环使用 -

NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateThings:) userInfo:nil repeats:YES];

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

答案 2 :(得分:4)

使用-scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:,不要拨打-fire

并使用您的时间间隔的浮点数。即,1.0 / 3.0。

答案 3 :(得分:1)

您必须将其添加到运行循环中:

  

在运行循环中调度计时器

     

可以注册计时器对象   虽然可以添加到多次运行,但一次只能运行一个循环   该运行循环中的循环模式。有三种方法可以创建   定时器:

     

1)使用scheduledTimerWithTimeInterval:invocation:重复:或   scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:class   创建计时器并在当前运行循环中计划它的方法   默认模式。

     

2)使用timerWithTimeInterval:invocation:重复:或   timerWithTimeInterval:target:selector:userInfo:repeats:class方法   创建计时器对象而不在运行循环上安排它。 (后   创建它,您必须通过调用手动将计时器添加到运行循环   addTimer:forMode:相应NSRunLoop对象的方法。)

     

3)分配定时器并使用   initWithFireDate:interval:target:selector:userInfo:repeats:method。   (创建后,必须手动将计时器添加到运行循环中   调用相应NSRunLoop的addTimer:forMode:方法   对象。)

     

一旦在运行循环上安排,计时器就会触发   指定的间隔,直到它失效。一个非重复的计时器   火灾发生后立即使其自动失效。但是,对于一个   重复计时器,你必须自己使计时器对象无效   调用其invalidate方法。调用此方法请求   从当前运行循环中删除计时器;结果,你   应始终从同一个线程调用invalidate方法   计时器已安装。定时器无效立即禁用   它使它不再影响运行循环。然后运行循环   在无效之前移除和释放计时器   方法返回或稍后返回。一旦失效,定时器对象   不能重复使用。

并且,当Costique发现(+1)时,您必须指定适当的时间间隔。

那么你应该全力以赴。

答案 4 :(得分:0)

将1/3替换为1.0 / 3.0。还可以使用 addTimer:forMode:来运行循环

答案 5 :(得分:0)

您尚未使用runloop安排此计时器。它触发的原因是你手动触发它。通常,您不需要这样做,但是您需要使用runloop安排它。您可以使用便捷方法使用runloop自动安排计时器:

NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:1./3 target:self selector: @selector(updateThings:) userInfo:nil repeats:YES];