2

I have an NSTimer which I pause and resume with the following methods respectively:

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

It is not properly resetting the fire date because when I check timer.fireDate, it says null. All we want is for these methods to pause the timer and resume the timer where it left off when the resume method is called. Any help is greatly appreciated.

Rafał Sroka
  • 39,540
  • 23
  • 113
  • 143
Dylan Vander Berg
  • 1,809
  • 1
  • 22
  • 37

1 Answers1

0

My solution differs from yours in one major thing. I recreate a timer when it resumes. Here is how I do it and it's been working quite well:

@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];
}

Hope it helps.

Rafał Sroka
  • 39,540
  • 23
  • 113
  • 143
  • I think you should be doing `[self.timer invalidate];` and `self.timer = nil;` to reset the property properly (it still contains a reference to an invalidated timer object in your version as `theTimer = nil` has no effect). – trojanfoe Mar 03 '14 at 23:22
  • @Bear with me, when `startTimer` is called using `_timer`, does it call `timerFireMethod` first to set `_elapsedTime = 0.0`?....otherwise how does `_timer` know what `_elapsedTime` is? – Pangu Mar 07 '16 at 16:58