iOs中的定时器有以下几种

  iOs=敖樯堋?

一、NSTimer

1。创建方法

NSTimer  * timer =, (NSTimer  scheduledTimerWithTimeInterval: 1.0,目标:self 选择器:@ selector(行动),用户信息:nil 重复:没有), <李>

TimerInterval :执行之前等待的时间,比如设置成1.0,就代表1秒后执行方法

<李>

target :需要执行方法的对象。

<李>

selector :需要执行的方法

<李>

repeats :是否需要循环

2。释放方法

[timer 无效];

注意:
调用创建方法后,目标对象的计数器会加1,直到执行完毕,自动减1。如果是循环执行的话,就必须手动关闭,否则可以不执行释放方法。

3。特性

存在延迟
不管是一次性的还是周期性的计时器的实际触发事件的时间,都会与所加入的RunLoop和RunLoop模式有关,如果此RunLoop正在执行一个连续性的运算,计时器就会被延时出发,重复性的计时器遇到这种情况,如果延迟超过了一个周期,则会在延时结束后立刻执行,并按照之前指定的周期继续执行。

必须加入RunLoop
使用上面的创建方式,会自动把定时器加入MainRunloop的NSDefaultRunLoopMode中。如果使用以下方式创建定时器,就必须手动加入RunLoop:

NSTimer  * timer =, (NSTimer  timerWithTimeInterval: 5,目标:self 选择器:@ selector (timerAction),用户信息:nil 重复:是的);   [[NSRunLoop  mainRunLoop], addTimer: timer  forMode: NSDefaultRunLoopMode];

二,CADisplayLink

1。创建方法

self.displayLink =, (CADisplayLink  displayLinkWithTarget: self 选择器:@ selector (handleDisplayLink:)];,,   [self.displayLink  addToRunLoop: [NSRunLoop  currentRunLoop], forMode: NSDefaultRunLoopMode];

2。停止方法

[self.displayLink 无效];,   时间=self.displayLink 零;

* *当把CADisplayLink对象添加到runloop中后,选择器就能被周期性调用,类似于重复的NSTimer被启动了,执行无效操作时,CADisplayLink对象就会从runloop中移除,选择器调用也随即停止,类似于NSTimer的无效方法。* *

3。特性

屏幕刷新时调用CADisplayLink是一个能让我们以和屏幕刷新率同步的频率将特定的内容画到屏幕上的定时器类.CADisplayLink以特定模式注册到runloop后,每当屏幕显示内容刷新结束的时候,runloop就会向CADisplayLink指定的目标发送一次指定的选择器消息,CADisplayLink类对应的选择器就会被调用一次,所以通常情况下,按照iOS设备屏幕的刷新率60次/秒

延迟

<李>

iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。但如果调用的方法比较耗时,超过了屏幕刷新周期,就会导致跳过若干次回调调用机会。

<李>

如果CPU过于繁忙,无法保证屏幕60次/秒的刷新率,就会导致跳过若干次调用回调方法的机会,跳过次数取决CPU的忙碌程度。

使用场景从原理上可以看的出,CADisplayLink适合做界面的不停重绘,比如视频播放的时候需要不停地获取下一帧用于界面渲染。

4。重要属性

<李>

frameInterval NSInteger类型的值,用来设置间隔多少帧调用一次选择器方法,默认值是1,即每帧都调用一次。

<李>

只读的持续时间的CFTimeInterval值,表示两次屏幕刷新之间的时间间隔。需要注意的是,该属性在目标的选择器被首次调用以后才会被赋值。选择器的调用间隔时间计算方式是:调用间隔时间=时间×frameInterval。

三、肾小球囊性肾病方式

执行一次

double  delayInSeconds =, 2.0;   dispatch_time_t  popTime =, dispatch_time (DISPATCH_TIME_NOW, delayInSeconds  *, NSEC_PER_SEC),,   dispatch_after (popTime, dispatch_get_main_queue(),, ^{(空白),//才能执行事件   });

重复执行

NSTimeInterval  period =, 1.0;,//设置时间间隔   dispatch_queue_t  queue =, dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);   dispatch_source_t  _timer =, dispatch_source_create (DISPATCH_SOURCE_TYPE_TIMER, 0, 0,,队列);   dispatch_source_set_timer (_timer, dispatch_walltime (NULL,, 0), period  *, NSEC_PER_SEC,, 0),,//每秒执行   dispatch_source_set_event_handler (_timer, ^ {//才能在这里执行事件   });   dispatch_resume (_timer);

iOs中的定时器有以下几种