NSTimer的使用

NSTimer 的使用

为什么会写NSTimer呢?

原因很简单, 这里有坑!

NSTimer 使用的顺序
  1. 创建NSTimer
  2. 销毁NSTimer
  3. NSTimer和Runloop
  • 创建NSTimer
    NSTimer有三种创建的方式 :
    这三种创建方式在现实工作使用中的使用频率是依次递增的.
  1. - (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats
  2. + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats
  3. + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

我们先从使用最多的scheduledTimer讲起, 当使用scheduledTimer这个方法的时候, 我们不仅仅是创建了一个NSTimer的对象, 还将这个定时器的对象加入到了当前的运行环runloop中.

NSTimer对象只有被加入到了当前的runloop中才会被执行
所以当你使用前两个方法的时候, 需要手动的将NSTimer对象加入到runloop中

  • 销毁NSTimer
    要在viewWillDisappear的时候将创建的NSTimer对象销毁掉
    - (void)viewWillDisappear:(BOOL)animated { super viewWillDisappear:animated;
    _timer invalidate; _timer = nil;
    `}

  • NSTimer 和 Runloop
    runloop会运行在不同的mode, 简单来说有以下两种mode
    • NSDefaultRunLoopMode, 默认的mode
    • UITrackingRunLoopMode, 当处理UI滚动操作时的mode

通常情况下NSDefaultRunLoopMode和UITrackingRunLoopMode都已经被加入到了common modes集合中, 所以不论runloop运行在哪种mode下, NSTimer都会被及时触发. 所以我们在加入到当前线程
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
时已经是加入了两种mode了, 此时你在滚动UI的时候是可以处理定时器的了

以上

cool

你可能感兴趣的:(NSTimer的使用)