iOS中的Timer Note
- NSTimer:
NSTimer就是CFRunLoopTimerRef,一个NSTimer注册到RunLoop之后,RunLoop会为其重复的时间点注册耗时间。
然而因为RunLoop为了节省资源,并不会在非常准确的时间点回调这个Timer,有一个属性叫做Tolerance(宽容度),假如超过其最大的误差,那个时间点的回调将会跳过去。
CFRunLoopTimerRef 是基于时间的触发器,它和 NSTimer 是toll-free bridged 的,可以混用。其包含一个时间长度和一个回调(函数指针)。当其加入到 RunLoop 时,RunLoop会注册对应的时间点,当时间点到时,RunLoop会被唤醒以执行那个回调。
CADisplayLink:
是一个和屏幕刷新率(60 times/second)一致的定时器(并不等同与NSTimer,内部实现是通过一个Source实现)。同样地,假如在两次屏幕刷新之间执行了一个长任务,那其中就会有一帧被跳过去。PerfromSelector/ dispatch_after:
上面两个函数都是通过创建一个Timer并添加到当前的RunLoop中。假如当前的线程没有RunLoop,则方法失效。