以下仅执行一次。为什么,当重复设置为YES?
NSTimer *timer = [NSTimer timerWithTimeInterval:1/3 target:self
selector:@selector(updateThingsRepeatedly:) userInfo:nil repeats:YES];
[timer fire];
如果我理解正确的话,updateThingsRepeatedly
方法应该每1/3秒反复调用一次。这不正确吗?
它确实调用方法,但是,并没有像我期望的那样启动循环。
答案 0 :(得分:6)
1/3
评估为0.将其替换为1.0/3.0
,您将被设置。
这是处理数字的C方式。您必须提示编译器有关所需的表达式类型。 1/3
是整数除法,其结果是整数。 1.0/3.0
为double
,1.0f/3.0f
为float
。使用强制转换可以达到相同的效果:(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];