NSTimer 简单使用方法

前言

NSTimer一般用来定时,以便出发需要周期性执行的任务或者间隔一定时间后执行的任务。

使用方法

常用的启动定时器的方法有两种:

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

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

停止方法

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

简便的方法(第一种)

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti 
target:(id)aTarget 
selector:(SEL)aSelector 
userInfo:(nullable id)userInfo 
repeats:(BOOL)yesOrNo;
参数:
(NSTimeInterval)ti  :延时时间(double类型)
target:(id)aTarget  :监听时钟触发的对象
selector:(SEL)aSelector :时钟触发的方法
userInfo:(nullable id)userInfo :可以是任意对象,通常为nil
repeats:(BOOL)yesOrNo :是否重复触发(为YES时,每隔一定的延时时间就会触发方法,为NO时,从现在开始间隔一定的延时时间就会触发,但只触发一次)

是简便的方法,使用示例如下:

//每隔1秒就会触发updateTime方法
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];

//定时器触发方法
- (void)updateTime
{
   //定时时间到后会触发改方法
}

这种方法使用时有弊端,就是当界面有滚动监听时(如有一个UITextView),到了延时时间并不会去执行触发方法,等停止滚动时才会执行触发方法。
这就需要第二种启动定时器的方法。

第二种启动定时器的方法

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

参数:
(NSTimeInterval)ti  :延时时间(double类型)
target:(id)aTarget  :监听时钟触发的对象
selector:(SEL)aSelector :时钟触发的方法
userInfo:(nullable id)userInfo :可以是任意对象,通常为nil
repeats:(BOOL)yesOrNo :是否重复触发(为YES时,每隔一定的延时时间就会触发方法,为NO时,从现在开始间隔一定的延时时间就会触发,但只触发一次)

使用示例:

self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];
// 将timer添加到运行循环
// 模式:NSRunLoopCommonModes的运行循环模式(监听滚动模式)
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

NSRunLoopCommonModes模式为监听滚动模式,将定时器加入该模式就和滚动触发事件在同一个等级,这样就不会受滚动事件的影响了。

另外还有一种模式,DefaultRunLoopMode,默认模式,加入这种模式就和第一种方法的效果相同了。

总结

所以说使用NSTimer来定时其定时有时候会不准确,通常使用NSTimer来触发时间间隔相对较长,且如果不准确对后果无太大影响的事件。
如果要出发时间间隔较短的事件可以使用CADisplayLink CADisplayLink参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容