2012-06-18 70 views
1

我有一個重複的計時器,可以運行時鐘。在時鐘運行期間,我打電話給stopTimer,時鐘應該停止。這已經在iPhone上運行了100%,但是在iPad上它有時會無法停止計時器。大約有50%的時間發生這種情況。 在停止方法中調用NSLog。NSTimer不會在iPad上失效,但在iPhone上工作正常

這裏是我的計時器代碼:

- (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

您的應用程序在計時器期間是否發生任何滾動?這觸發了一種不同類型的runloop,這會導致計時器不能開火或遲到。 – kevboh

+0

是的,整個遊戲都基於滾動! 計時器觸發得很好,因爲時鐘每0.01秒更新一次。我檢查了.isValid屬性,它是有效的,因此必須是運行循環問題。爲什麼這隻會在iPad上有所不同?我能做些什麼來解決它(在另一個運行循環中運行定時器?) – Darren

+0

對不起,它不是滾動,我正在使用UISliders。 – Darren

回答

1

創建而不使用+timerWith...方法安排它,然後使用[[NSRunLoop currentRunLoop] addTimer:timer forMode: NSRunLoopCommonModes]自行安排在runloop上,以便在所有runloops上運行它。讓我知道這是否有效。

+0

在你寫這裏之前,我試過了。我嘗試了mainRunLoop和currentRunLoop,但它沒有幫助。定時器運行正常,有時不會停止。 – Darren

+0

嗯。確保你的定時器回調看起來像 - (void)timerFireMethod:(NSTimer *)theTimer。 – kevboh

+0

我現在覺得很愚蠢。計時器沒有任何問題!因爲我只是倒計時1秒,所以很難注意到,但在開始新遊戲之前我沒有將int重置爲0!衛生署!對不起,但都謝謝。 – Darren

0

對於一款遊戲,或許您應該使用CADisplayLink而不是NSTimer。

相關問題