美文网首页
iOS中的定时器

iOS中的定时器

作者: 骑着雅迪小毛驴上班的老瞿 | 来源:发表于2018-01-07 15:14 被阅读0次

打算将定时器这种东西做一个全部的总结,一直没有去弄,在这里做一次全部的整理;希望在以后的工作中可以用到
1.GCD中使用定时器

 // 这里的队列是全局队列,全局队列的话系统给我们开启了一个新的全局线程,所以,在这里定时器不是在UI线程里面进行的,所以不会阻塞掉主线程的
 self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
        dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
        dispatch_source_set_event_handler(self.timer, ^{
            NSLog(@"我是定时器2222");
        });
        //启动定时器(不调用这个方法定时器是不会启动的)
        dispatch_resume(self.timer); 

2.NSTimer

1> 使用target方法创建定时器
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(run) userInfo:nil repeats:YES];

2> 使用block创建的定时器
[NSTimer scheduledTimerWithTimeInterval:0.5 repeats:YES block:^(NSTimer * _Nonnull timer) {
        NSLog(@"---------");
    }];

// 这两个中创建定时器的时候吗,如果有UI滚动,比如scrollview的滚动的时候,定时器就会失效,最好的办法就是将其加入runloop里面就不会定时器失效
// 注意:runloop的mode应该设置为 [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
// 定时器的销毁:[timer invalidate];
// 使用timer的话有时候我们需要在定时器启动的时候就调用到对应的需要执行的定时器的方法..如果是target的话,我们可以调用到对应的响应方法...可是如果我们是使用到的timer的block方法创建的话,,我们就没有办法,让定时器一走完,立马就开始运行,,所以我们关于NSTimer的使用的时候,如果需要立马开始定时器,,我们可以调用
[timer fire];// 这个方法
  1. CADisplayLink(这个用的不是很多,一般和屏幕刷新类似的有关系,类似于NSTimer定时器)
CADisplayLink

    // 创建displayLink

    CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(test:)];

    // 将创建的displaylink添加到runloop中,否则定时器不会执行

    [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];



    // 停止定时器

    [displayLink invalidate];

    displayLink = nil;

当把CADisplayLink对象add到runloop中后,selector就能被周期性调用,类似于重复的NSTimer被启动了;执行invalidate操作时,CADisplayLink对象就会从runloop中移除,selector调用也随即停止,类似于NSTimer的invalidate方法

调用时机

CADisplayLink是一个和屏幕刷新率同步的定时器类。CADisplayLink以特定模式注册到runloop后,每当屏幕显示内容刷新结束的时候,runloop就会向CADisplayLink指定的target发送一次指定的selector消息,CADisplayLink类对应的selector就会被调用一次,所以可以使用CADisplayLink做一些和屏幕操作相关的操作。

重要属性

frameInterval
NSInteger类型的值,用来设置间隔多少帧调用一次selector方法,默认值是1,即每帧都调用一次。
duration
readOnly的CFTimeInterval值,表示两次屏幕刷新之间的时间间隔。需要注意的是,该属性在target的selector被首次调用以后才会被赋值。selector的调用间隔时间计算方式是:调用间隔时间 = duration × frameInterval。

总结:定时器这东西反正是挺消耗性能的.性能最高的我们一般使用的上的还是GCD这种.推荐使用

相关文章

  • iOS进阶-谈谈定时器

    目录 iOS提供定时器API 定时器开发中的坑 一、 iOS提供定时器API 二、定时器开发中的坑 2.1、必须办...

  • iOS中的定时器

    点击这里>> cocoaChina: iOS中的定时器 iOS中定时器有三种,分别是NSTimer、CADispl...

  • GCD定时器使用

    iOS中的常用定时器分为这几类: NSTimer CADisplayLink GCD定时器 选择GCD定时器原因:...

  • iOS:NSTimer的几种创建方式

    在iOS开发中,经常会用到定时器,iOS中常用的定时器有三种:NSTimer,GCD,CADisplayLink。...

  • 定时器的使用介绍

    iOS中的定时器大致分为这几类: NSTimer CADisplayLink GCD定时器 (一)NSTimer ...

  • iOS Timer

    iOS开发中定时器经常会用到,iOS中常用的定时器有三种,分别是NSTime,CADisplayLink和GCD。...

  • iOS三大定时器

    iOS开发中定时器经常会用到,iOS中常用的定时器有三种,分别是NSTime,CADisplayLink和GCD。...

  • Flutter 网络请求类封装及搜索框实现

    Flutter 中定时器的使用 在 Flutter 中定时器相对 iOS 来说比较好的一点就是定时器事件的执行不会...

  • 无标题文章

    iOS NSTimer使用详解-开启、关闭、移除 定时器定时器详解ios定时器关闭定时器NSTimer 1、要使用...

  • iOS 定时器耗电探究

    iOS开发中的几种定时器 iOS开发中定时器实现方式大致有三种,一种是Timer实现,一种是通过GCD自己创建,另...

网友评论

      本文标题:iOS中的定时器

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