iOS_Timer

iOS Timer:`dispatch_source_t`、`CADisplayLink`、`NSTimer `

Posted by kunnan on December 13, 2016

前言

使用场景

  • 登录注册场景的短信倒计时
  • 定时向服务器发起请求(定时任务)

iOS定时器的实现方式

iOS中的定时器,大多用于延时执行或重复执行某些动作(codeSnippets)

  • iOS中的定时器:NSTimerCADisplayLinkGCD
    1) NSTimer 使用简单方便,但是应用条件有限。
    2) CADisplayLink 刷新频率与屏幕帧数相同,用于绘制动画。
    3) GCD定时器 精度高,可控性强
    

1、NSTimer

1、1 创建对象

  • NSTimer不是绝对准确的UIScrollView滑动会暂停计时
    不想被`UIScrollView`滑动影响,将 `timer` 添加再到 `UITrackingRunLoopMode`
    

2、CADisplayLink

  • A CADisplayLink object is a timer object that allows your application to synchronize its drawing to the refresh rate of the display
    /** Class representing a timer bound to the display vsync. **/
    
  • CADisplayLink对象是一个和屏幕刷新率同步的定时器对象。每当屏幕显示内容刷新结束的时候,runloop就会向CADisplayLink指定的target发送一次指定的selector消息.
    CADisplayLink适合做界面的不停重绘,比如视频播放的时候需要不停地获取下一帧用于界面渲染,或者做动画。
    

2.1 使用方法

* 创建:CADisplayLink

2.2 特点

  • 刷新频率固定

    iOS设备的屏幕刷新频率是固定60Hz

  • 屏幕刷新时调用

    CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。

  • 适合做界面渲染

    CADisplayLink可以确保系统渲染每一帧的时候我们的方法都被调用,从而保证了动画的流畅性。

3、GCD

RunLoop也是基于GCD实现的,因此有很高的精确度。

3、1 dispatch_after

3.2 创建GCD定时器

3、3 使用dispatch信号量dispatch_semaphore_t 是如何实现同步

两种方式实现:在block中异步请求服务器切换IP,并且控制最多尝试的切换次数

*dispatch_semaphore_t: 在block中异步请求服务器切换IP的例子,

GCD的使用小结

queue、dispatch_group、semaphore、dispatch

转载请注明: > iOS_Timer