创建定时器Timer的两种方式

// NSTimer
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; 

上面方法只创建定时器,并没有自动添加定时器,需执行

// NSRunLoop
//[NSRunLoop mainRunLoop] 
- (void)addTimer:(NSTimer *)timer forMode:(NSString *)mode; 

添加创建的定时器。mode可选。

// NSTimer
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; 

上面方法已创建并自动向NSRunLoop添加了定时器。默认的mode为NSDefaultRunLoopMode。

NSRunLoop会监听两种事件:

  1. 人为触摸事件;
  2. 定时器调用造成的事件;
    创建定时器Timer的两种方式_第1张图片

以上mode有两种(NSRunLoop):
NSDefaultRunLoopMode; // 只能同时支持一种事件,一种发生会停止另一种
NSRunLoopCommonModes; // 同时支持两个事件,两个事件都可监听,都可执行

所以第二种创建方法有时会发生操作另一个控件时,定时器停止的现象。

通过invalidate方法可以停止定时器的工作,一旦定时器被停止了,就不能再次执行任务。只能再创建一个新的定时器才能执行新的任务

你可能感兴趣的:(创建定时器Timer的两种方式)