定时器的3种方式

作者: hAo_JS | 来源:发表于2016-11-17 11:54 被阅读71次
#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) CADisplayLink *displayLink;

@end

@implementation ViewController
{
    dispatch_source_t _timer;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
#if 0
    // 第一种创建方式:
//    [NSTimer scheduledTimerWithTimeInterval:<#(NSTimeInterval)#> target:<#(nonnull id)#> selector:<#(nonnull SEL)#> userInfo:<#(nullable id)#> repeats:<#(BOOL)#>];
#endif
    
    
#if 0
    // 第二种创建方式:
    // CADisplayLink 与屏幕的刷新率,一般屏幕的默认刷新次数为60/s
    _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(update)];
    
    // 修改刷新频率,多少帧刷新一次
    _displayLink.frameInterval = 60;
    
    // 销毁
//    [_displayLink invalidate];
//    _displayLink = nil;
    
    // 当添加到RunLoop中会立即执行
    [_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
#endif
    
    
#if 1
    
    __block int j = 0;
    
    // 第三种创建方式:
    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
    // intervarlInSeconds 每个多久执行一次
    // leewayInSeconds    允许出现多少误差,0为最精准
    dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
    // 执行的事件
    dispatch_source_set_event_handler(_timer, ^{
        
        NSLog(@"%d", j++);
    });
    
    // 执行
    dispatch_resume(_timer);
    
    // 停止
//    dispatch_source_cancel(timer);
#endif
}

- (void)update
{
    static int index = 0;
    
    NSLog(@"%d", index++);
    
    if (index == 5)
    {
        // 暂停
        _displayLink.paused = YES;
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            
            // 继续
            _displayLink.paused = NO;
        });
    }
}

CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器。

CADisplayLink 与 NSTimer 有什么不同?
iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。NSTimer的精确度就显得低了点,比如NSTimer的触发时间到的时候,runloop如果在阻塞状态,触发时间就会推迟到下一个runloop周期。并且 NSTimer新增了tolerance属性,让用户可以设置可以容忍的触发的时间的延迟范围。CADisplayLink使用场合相对专一,适合做UI的不停重绘,比如自定义动画引擎或者视频播放的渲染。NSTimer的使用范围要广泛的多,各种需要单次或者循环定时处理的任务都可以使用。

在UI相关的动画或者显示内容使用 CADisplayLink比起用NSTimer的好处就是我们不需要在格外关心屏幕的刷新频率了,因为它本身就是跟屏幕刷新同步的。

相关文章

  • swift Timer 定时器

    方式1 方式2 这种定时器的创建需要使用 fire 来启动定时器。否则,该定时器不起作用。如果定时器不添加到 Ru...

  • JavaScript

    javascript引入方式 定时器

  • iOS开发:RunLoop的基本用法

    定时器(NSTimer) 一般定时器的常用的创建方式可为俩大类: 1)timerWithTimeInterval,...

  • Golang-基于TimeingWheel定时器

    设计思路 在linux下实现定时器主要有如下方式 基于链表实现定时器 基于排序链表实现定时器 基于最小堆实现定时器...

  • 命题_第十三章_简答

    当定时器T0用做方式3时,由于TR1位已被T0占用,如何控制定时器T1的开启和关闭? 【答案】定时器T0用做方式3...

  • 十四章简答题

    定时器/计数器T0和T1各有几种工作方式?简述每种工作方式的特点。如何控制定时器/计数器的工作方式? 答: TO可...

  • 命题-第十三章-选择

    AT89S51单片机的定时器/计数器有两种工作模式,( )种工作方式,其中方式1为( )位定时器/计数...

  • NSTimer介绍

    定时器是什么? 定时器提供执行延迟动作或周期性动作的方式。 定时器等待直到一定时间间隔过去,然后触发,向指定的对象...

  • 十四章填空题(纯手打)

    1. 定时器/计数器T0可以工作于方式( ) 2. 方式0为( )位定时器/计数器 3. 若系统晶振频率...

  • RxSwift定时器探索

    定时器创建 RxSwift中定时器的创建有两种方式: 从上可以知道,可以通过timer和interval创建,由源...

网友评论

    本文标题:定时器的3种方式

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