前言
使用场景
- 登录注册场景的短信倒计时
- 定时向服务器发起请求(定时任务)
iOS定时器的实现方式
iOS中的定时器,大多用于延时执行或重复执行某些动作(codeSnippets)
- iOS中的定时器:NSTimer、CADisplayLink、GCD
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 使用方法
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,并且控制最多尝试的切换次数