iOS-五种定时器总结

作者: 船长_ | 来源:发表于2015-11-14 20:26 被阅读1325次

1. CADisplayLink定时器

  • CADisplayLink是一个能让我们以和屏幕刷新率同步的频率将特定的内容画到屏幕上的定时器类。
  • CADisplayLink有两种模式注册到runloop
    • NSDefaultRunLoopMode当进行其他UI刷新操作会停止定时器
    • NSRunLoopCommonModes当进行其他UI刷新操作不会停止定时器
  • 所以通常情况下,按照iOS设备屏幕的刷新率60次/秒
  • 应用场景:从原理上可以看出,CADisplayLink适合做界面的不停重绘,比如视频播放的时候需要不停地获取下一帧用于界面渲染。
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(nextImage)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop]forMode:NSRunLoopCommonModes]; [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];
 // 关闭定时器两种方法
 self.displayLink.paused = NO;
 [self.displayLink invalidate];

2.延迟调用

[self performSelector:@(方法名) withObject:nil afterDelay:1.0];

3.NSTimer

  • 比较常用
  • 添加到runLoop有两种模式
  - (void)addTimer{
self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
// 当进行其他UI刷新操作不会停止定时器
 [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
// 当进行其他UI刷新操作会停止定时器
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
}

4.GCD定时器

  • 比较常用,不解释
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 1秒后执行block里面的代码
}

5.GCD中的非常精确的定时器

  • 比较少用
  • 比较消耗性能
    //0.创建一个队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    //1.创建一个GCD的定时器
    /*
     第一个参数:说明这是一个定时器
     第四个参数:GCD的回调任务添加到那个队列中执行,如果是主队列则在主线程执行
     */
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

    //2.设置定时器的开始时间,间隔时间以及精准度

    //设置开始时间,三秒钟之后调用
    dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW,3.0 *NSEC_PER_SEC);
    //设置定时器工作的间隔时间
    uint64_t intevel = 1.0 * NSEC_PER_SEC;

    /*
     第一个参数:要给哪个定时器设置
     第二个参数:定时器的开始时间DISPATCH_TIME_NOW表示从当前开始
     第三个参数:定时器调用方法的间隔时间
     第四个参数:定时器的精准度,如果传0则表示采用最精准的方式计算,如果传大于0的数值,则表示该定时切换i可以接收该值范围内的误差,通常传0
     该参数的意义:可以适当的提高程序的性能
     注意点:GCD定时器中的时间以纳秒为单位(面试)
     */

    dispatch_source_set_timer(timer, start, intevel, 0 * NSEC_PER_SEC);

    //3.设置定时器开启后回调的方法
    /*
     第一个参数:要给哪个定时器设置
     第二个参数:回调block
     */
    dispatch_source_set_event_handler(timer, ^{
        NSLog(@"------%@",[NSThread currentThread]);
    });

    //4.执行定时器
    dispatch_resume(timer);

    //注意:dispatch_source_t本质上是OC类,在这里是个局部变量,需要强引用
    self.timer = timer;

相关文章

  • iOS-五种定时器总结

    1. CADisplayLink定时器 CADisplayLink是一个能让我们以和屏幕刷新率同步的频率将特定的内...

  • iOS-定时器

    一.NSTimer 推荐亮点: 1.实用与图片轮播等频率不快的需求 相关操作: 1.暂停 [self.DD_Tim...

  • IOS-定时器

    一、NSTimer(存在延迟) 创建方法 TimerInterval : 执行之前等待的时间。比如设置成1.0,就...

  • Quartz定时器

    Quartz定时器的学习总结_给的再多~不如懂我-CSDN博客_quartz定时器 Quartz定时器 官方文档翻...

  • NSTimer定时器类

    Runloop定时器的应用及关闭iOS NSTimer 定时器用法总结 1.定时器的创建 参数1:时间间隔(定时的...

  • 实战中总结iOS定时器timer的注意点

    本文旨在总结项目中因使用各类定时器而踩到的坑,并附上经验总结。 NSTimer NSTimer是最常用的定时器,坑...

  • iOS定时器看我就够了

    这篇文章总结iOS开发中用到的全部和定时器相关的内容,用到某个定时器就会总结一下,所以持续更新中~ CADispl...

  • iOS-定时器相关

    定时器相关文档内容. 1.一个play方法实现全屏炫酷倒计时的小demoiOS轮播图:CADisplayLink实...

  • iOS-定时器 NSTimer

    首先关闭定时器不能使用上面的方法,应该使用下面的方法: 然后就可以使用下面的方法再此开启这个timer了:

  • 5.18 总结

    1 数组去重 js数组去重的常用方法总结 2 定时器的返回值是定时器的编号 定时器的执行;(全部js代码执...

网友评论

本文标题:iOS-五种定时器总结

本文链接:https://www.haomeiwen.com/subject/elrkhttx.html