美文网首页iOS开发iOS开发JC专题
iOS几种定时器的使用方法

iOS几种定时器的使用方法

作者: 齐滇大圣 | 来源:发表于2016-02-18 20:34 被阅读1696次

iOS里常常会用到一些定时器的地方,这里有这么几种方法可以使用:
NSTimer、CADisplayLink 和 GCD

一、NSTimer####

NSTimer是我们在写iOS定时器的时候比较常用的一种,关于NSTimer有几点需要注意的,一是内存泄露问题,二是延时问题。关于这些这些问题的解决和NSTimer的使用在NSTimer需要注意的地方中有写。

二、CADisplayLink####

  • 创建方法

    @interface ViewController ()
    @property (nonatomic) CADisplayLink *displayLink;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
          [super viewDidLoad];
          _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
          _displayLink.frameInterval = 60;
          [_displayLink addToRunLoop:[NSRunLoop currentRunLoop] 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就会被调用一次。所以通常情况下,按照iOS设备屏幕的刷新率60次/秒

    延迟:iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。但如果调用的方法比较耗时,超过了屏幕刷新周期,就会导致跳过若干次回调调用机会。 如果CPU过于繁忙,无法保证屏幕60次/秒的刷新率,就会导致跳过若干次调用回调方法的机会,跳过次数取决CPU的忙碌程度。

使用场景:从原理上可以看出,CADisplayLink适合做界面的不停重绘,比如视频播放的时候需要不停地获取下一帧用于界面渲染。

  • 重要属性

frameInterval
NSInteger类型的值,用来设置间隔多少帧调用一次selector方法,默认值是1,即每帧都调用一次。

duration
readOnly的CFTimeInterval值,表示两次屏幕刷新之间的时间间隔。需要注意的是,该属性在target的selector被首次调用以后才会被赋值。selector的调用间隔时间计算方式是:调用间隔时间 = duration × frameInterval。

三、GCD####

  • 创建方法

      @interface ViewController ()
    
      @property (nonatomic) dispatch_source_t timer;
    
      @end
    
      @implementation ViewController
    
      - (void)viewDidLoad {
          [super viewDidLoad];
    
          double delayInSeconds = 1.0;
          _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));
          dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC, 0.0);
          dispatch_source_set_event_handler(_timer, ^{
              NSLog(@"timer date 1== %@",[NSDate date]);
          });
          dispatch_resume(_timer);
      }
    
  • 停止方法

    dispatch_source_cancel(self.timer);
    dispatch_release(self.timer);
    self.source = nil;
    

四、github上一些关于定时器的项目####

参考自####

NSTimer、CADisplayLink、GCD 三种定时器的用法

相关文章

  • 每日笔记

    1、通过safari打开网页 2、iOS的几种定时器及区别 iOS的几种定时器及区别 3、long long类型 ...

  • iOS几种定时器的使用方法

    iOS里常常会用到一些定时器的地方,这里有这么几种方法可以使用:NSTimer、CADisplayLink 和 G...

  • iOS 定时器

    iOS中定时器的几种方法 : 1> [self performSelector:@selector(<#selec...

  • iOS 定时器耗电探究

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

  • IOS 定时器总结

    转自: iOS中几种定时器 - 控制了时间,就控制了一切 定时器三种方法: NSTimerCADisplayLin...

  • IOS定时器操作和NSTimer的各种坑

    本文列举iOS的各种定时相关操作的使用方法,欢迎大家补充指教。主要包括: NSTimer GCD定时器 dispa...

  • iOS定时器

    本文列举iOS的各种定时相关操作的使用方法,欢迎大家补充指教。主要包括: NSTimer GCD定时器 dispa...

  • NSProxy&NSTimer

    原文链接 开发过程中我们必不可少的需要接触定时器,在iOS中,常用的定时器有以下几种: GCD Timer CAD...

  • 初识js下的定时器

    定时器 setTimeout、setInterval 定时器的使用方法 setTimeout(fn,1000) ...

  • VUE中定时器如何使用?

    定时器的创建和使用 定时器的销毁 定时器 setTimeout()方法 和 setInterval() 使用方法相...

网友评论

本文标题:iOS几种定时器的使用方法

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