「iOS」你会用几种方法实现计时器

Posted 愿己历尽千帆,归来仍是少年.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「iOS」你会用几种方法实现计时器相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

//    获得队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//    创建一个定时器
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
//    设置定时器
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1000 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
    dispatch_source_set_event_handler(timer, ^{
//        触发事件
//        取消定时器
        dispatch_cancel(timer);
    });
//    启动定时器
    dispatch_resume(timer);

以上是关于「iOS」你会用几种方法实现计时器的主要内容,如果未能解决你的问题,请参考以下文章

高效率完成工作的12种热门编程语言,你会用几个?

Vim高级入门功能:你会用几个?

2021最好用的10款自动化测试工具,你会用几款?

作为TensorFlow的底层语言,你会用C++构建深度神经网络吗?

进阶你会用PHP+Redis实现延迟任务 实现自动取消订单,自动完成订单吗?

如何在Swift中叠加视频上的动态标签?