2014-03-03 32 views
2

我有一個NSTimer,我停下來,分別與下面的方法恢復:的NSTimer無法正常暫停和恢復

-(void) pauseTimer:(NSTimer *)timer { 
    self.scene.paused = YES; 

    pauseStart = [NSDate date]; 

    previousFireDate = [timer fireDate]; 

    [timer setFireDate:[NSDate distantFuture]]; 
} 

-(void) resumeTimer:(NSTimer *)timer { 
    self.scene.paused = NO; 
    NSDate *currentDate = [NSDate date]; 
    NSTimeInterval pauseTime = [currentDate timeIntervalSinceDate:pauseStart]; 
    NSDate *neededFireDate = [NSDate dateWithTimeInterval:pauseTime sinceDate:previousFireDate]; 
    [timer setFireDate:neededFireDate]; 
    NSLog(@"Fire Date: %@", timer.fireDate); //returning null 
} 

它不能正常復位火日期,因爲當我檢查timer.fireDate,它說null 。我們只需要這些方法來暫停計時器,並在繼續方法被調用時恢復停止的計時器。任何幫助是極大的讚賞。

+0

是你的問題[這是一個副本](http://stackoverflow.com/questions/9975562/how-to-pause-play-nstimer)? –

+0

你是否檢查過'neededFireDate'不是零? – Macondo2Seattle

+0

@BlackRider'neededFireDate'不是'nil'。這是一個有效的'NSDate' - '2014-03-03 23:11:33 + 0000'。 –

回答

0

我的解決方案與您的主要不同。恢復時重新創建一個計時器。下面是我如何做,它一直工作得很好:

@property (nonatomic, strong) NSTimer *timer; 
@property (nonatomic, assign) NSTimeInterval elapsedTime; 
@property (nonatomic, strong) NSDate *startDate; 

- (void)startTimer 
{ 
    NSTimeInterval timeInterval = 20.0f; 

    // Create a timer. Adjust the elapsed time. 
    _timer = [NSTimer scheduledTimerWithTimeInterval:(timeInterval - _elapsedTime) 
               target:self 
              selector:@selector(timerFireMethod:) 
              userInfo:nil 
              repeats:YES]; 
    // Save the start date. 
    _startDate = [NSDate date]; 
} 


- (void)timerFireMethod:(NSTimer *)theTimer 
{ 
    // Clean. 
    [_timer invalidate]; 
    _timer = nil; 
    _elapsedTime = 0.0; 

    [self startTimer]; 

    // Additional handling. 
} 


- (void)pauseTimer 
{ 
    // Clean. 
    [_timer invalidate]; 
    _timer = nil; 

    // Save the elapsed time. 
    _elapsedTime = [[NSDate date] timeIntervalSinceDate:_startDate]; 
} 

希望它有幫助。

+0

我認爲你應該做'[self.timer invalidate];'和'self.timer = nil;'重置屬性正確(它仍然包含在您的版本中作爲'theTimer = nil'的無效定時器對象的引用沒有效果)。 – trojanfoe

+0

謝謝。你是對的。我糾正了它。 – RaffAl

+0

@與我一起,當'startTimer'使用'_timer'調用時,它是否首先調用'timerFireMethod'來設置'_elapsedTime = 0.0'?....否則'_timer'怎麼知道'_elapsedTime'是什麼? – Pangu