我有一个按时钟运行的重复计时器。在时钟运行期间,我调用stopTimer,时钟应该停止。这在iPhone上有100%的效果,但在iPad上它有时会无法停止计时器。大约50%的时间都会发生这种情况。 NSLog是在stop方法中调用的。
这是我的计时器代码:
- (void)startSliderTimer
{
// Get start time
[self stopTimer];
startTime = [NSDate timeIntervalSinceReferenceDate] + kmaxTimePerSlider;
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.01f target:self selector:@selector(updateClock) userInfo:nil repeats:YES];
}
- (void)updateClock
{
NSTimeInterval currentTimer = [NSDate timeIntervalSinceReferenceDate];
NSTimeInterval currentTimeLeft = startTime - currentTimer;
if (currentTimeLeft >= 0) {
int seconds = currentTimeLeft;
float milliseconds = currentTimeLeft - seconds;
int mill = milliseconds * 1000;
NSString* displayTime = [NSString stringWithFormat: @"%02d:%03d",seconds,mill];
timerLbl.text = displayTime;
} else {
[self tooSlow];
}
}
- (void) stopTimer
{
NSLog(@"%s",__FUNCTION__);
if (self.timer) {
NSLog(@"Stop Timer");
[self.timer invalidate];
self.timer = nil;
}
}
我刚尝试像这样运行计时器作为另一个问题/答案中的建议,但它仍然不会一直无效:
self.timer = [NSTimer timerWithTimeInterval:0.01f target:self selector:@selector(updateClock) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
答案 0 :(得分:1)
创建计时器而不使用+timerWith...
方法安排计时器,然后使用[[NSRunLoop currentRunLoop] addTimer:timer forMode: NSRunLoopCommonModes]
在runloop上自行安排计时器在所有runloops上运行它。如果有效,请告诉我。
答案 1 :(得分:0)
对于游戏,也许您应该使用CADisplayLink而不是NSTimer。