How can I programmatically pause an NSTimer?

前端 未结 15 1779
梦毁少年i
梦毁少年i 2020-11-27 13:06

I\'m using an NSTimer to do some rendering in an OpenGL based iPhone app. I have a modal dialog box that pops up and requests user input. While the user is providing input

15条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-27 13:22

    Based off @Thiru and @kapesoftware's answers, I made an Objective-C category on NSTimer using Associated Objects for pausing and resuming the timer.

    #import 
    
    @interface NSTimer (PausableTimer)
    
    @property (nonatomic, retain) NSDate *pausedDate;
    
    @property (nonatomic, retain) NSDate *nextFireDate;
    
    -(void)pause;
    
    -(void)resume;
    
    @end
    

    ...

    @implementation NSTimer (PausableTimer)
    
    static char * kPausedDate = "pausedDate";
    static char * kNextFireDate = "nextFireDate";
    
    @dynamic pausedDate;
    @dynamic nextFireDate;
    
    -(void)pause {
    
      self.pausedDate = [NSDate date];
    
      self.nextFireDate = [self fireDate];
    
      [self setFireDate:[NSDate distantFuture]];
    }
    
    -(void)resume
    {
      float pauseTime = -1*[self.pausedDate timeIntervalSinceNow];
    
      [self setFireDate:[self.nextFireDate initWithTimeInterval:pauseTime sinceDate:self.nextFireDate]];
    }
    
    - (void)setPausedDate:(NSDate *)pausedDate
    {
      objc_setAssociatedObject(self, kPausedDate, pausedDate, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (NSDate *)pausedDate
    {
      return objc_getAssociatedObject(self, kPausedDate);
    }
    
    - (void)setNextFireDate:(NSDate *)nextFireDate
    {
      objc_setAssociatedObject(self, kNextFireDate, nextFireDate, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (NSDate *)nextFireDate
    {
      return objc_getAssociatedObject(self, kNextFireDate);
    }
    

    It keeps things tidy and means you don't have to create instance variables or properties just to pause and resume your timers.

提交回复
热议问题