经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
「iOS」你会用几种方法实现计时器
来源:cnblogs  作者:简易安  时间:2018/12/12 9:44:55  对本文有异议

1.NSTimer
存在一定的误差,不管是一次性的还是周期性的timer得实际触发事件的时间,都会与所加入的runloop和runloopMode有关,如果此runloop正在执行一个连续性的运算,timer就会被延时触发。

  1. // 创建方式1
  2. NSTimer *timer1 = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:YES];
  3. [timer1 invalidate];
  4. // 创建方式2==>推荐
  5. NSTimer *timer2 = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:YES];
  6. // 加入运行循环
  7. [[NSRunLoop mainRunLoop] addTimer:timer2 forMode:NSDefaultRunLoopMode];
  8. [timer2 invalidate];

2.CADisplayLink
CADisplayLink是一个能让我们以和屏幕刷新率同步的频率将特定的内容画到屏幕上的定时器类。CADisplayLink以特定模式注册到runloop后,每当屏幕显示内容刷新结束的时候,runloop就会向CADisplayLink指定的target发送一次指定的selector消息,CADisplayLink类对应的selector就会被调用一次。
iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会再每次刷新结束后都被调用,精确度相当高。使用场合相对专一,适合做UI的不同重绘,比如自定义动画引擎或者视频播放的渲染。不需要在格外关心屏幕的刷新频率了,本身就是跟屏幕刷新同步的。

  1. //创建对象
  2. CADisplayLink *display = [CADisplayLink displayLinkWithTarget:self selector:@selector(action:)];
  3. //加入当前循环
  4. [display addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
  5. //销毁
  6. [display invalidate];

3.GCD
NSTimer是在runloop的基础上执行的,然而runloop是在GCD的基础上实现的,所以说GCD可算是更加高级的。

  1. // 获得队列
  2. dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
  3. // 创建一个定时器
  4. dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
  5. // 设置定时器
  6. dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1000 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
  7. dispatch_source_set_event_handler(timer, ^{
  8. // 触发事件
  9. // 取消定时器
  10. dispatch_cancel(timer);
  11. });
  12. // 启动定时器
  13. dispatch_resume(timer);
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号