timer - ShenYj/ShenYj.github.io GitHub Wiki

timer

在 iOS 上 Timer 的方案有

  • NSTimer
  • CADisplayLink
  • GCD

NSTimer 可能是最常见的定时器方案,与 CADisplayLink 都会产生循环引用

解决循环引用的方案有

  • 使用 block 而不是 target
  • 通过中间件(NSObject), 通过快速转发 forwardingTargetForSelector, 返回消息的处理者
  • 通过中间件(NSProxy),通过代理实现 methodSignatureForSelector & forwardInvocation 完成转发
  • 直接使用 GCD

CADisplayLink 对比 NSTimer 精度更高一些,接近于屏幕刷新率

NSProxy 常见于一些开源框架

GCD 不同于前两者,不依赖于 RunLoop, 直接利用系统内核,精度更高,RxSwift 就是使用的 GCD Timer

GCD 的定时器使用并不复杂,早期也是倾向于直接使用 GCD 来实现定时器功能,直接避免了去处理循环引用的问题

e.g. Swift 下使用 GCD Timer

⚠️ **GitHub.com Fallback** ⚠️