关闭

IOS-定时器的创建

174人阅读 评论(0) 收藏 举报
分类:

在iOS中有很多方法完成定时器的任务,例如 NSTimer、CADisplayLink 和 GCD都可以。

一、NSTimer
1. 创建方法:

         NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:NO];

         TimerInterval : 执行之前等待的时间。比如设置成1.0,就代表1秒后执行方法
         target : 需要执行方法的对象。
         selector : 需要执行的方法
         repeats : 是否需要循环


2. 释放方法:
         [timer invalidate];

         注意 : 调用创建方法后,target对象的计数器会加1,直到执行完毕,自动减1。如果是循环执行的话,就必须手动关闭,否则可以不执行释放方法。

3. 特点:

         存在延迟:不管是一次性的还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoop Mode有关,如果此RunLoop正在执行一个连续性的运算,timer就会被延时出发。重复性的timer遇到这种情况,如果延迟超过了一个周期,则会在延时结束后立刻执行,并按照之前指定的周期继续执行。

         必须加入Runloop:使用上面的创建方式,会自动把timer加入MainRunloop的NSDefaultRunLoopMode中。如果使用以下方式创建定时器,就必须手动加入Runloop:

         NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
         [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];     //如果想定时器不受其他的影响,

二、CADisplayLink
1. 创建方法:

         CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
         [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];


2. 停止方法:
           [displayLink invalidate];
          displayLink = nil;

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

3. 特点:
         屏幕刷新时调用:CADisplayLink是一个能让我们以和屏幕刷新率同步的频率将特定的内容画到屏幕上的定时器类。CADisplayLink以特定模式注册到runloop后,每当屏幕显示内容刷新结束的时候,runloop就会向CADisplayLink指定的target发送一次指定的selector消息, CADisplayLink类对应的selector就会被调用一次。所以通常情况下,按照iOS设备屏幕的刷新率60次/秒

         延迟:iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。但如果调用的方法比较耗时,超过了屏幕刷新周期,就会导致跳过若干次回调调用机会。
         如果CPU过于繁忙,无法保证屏幕60次/秒的刷新率,就会导致跳过若干次调用回调方法的机会,跳过次数取决CPU的忙碌程度。
         使用场景:从原理上可以看出,CADisplayLink适合做界面的不停重绘,比如视频播放的时候需要不停地获取下一帧用于界面渲染。

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

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



三、GCD定时器

    1. 执行一次:

    double delayInSeconds = 2.0;

    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

         //执行事件

    });



    2. 重复执行:

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

    dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), 1.0 * NSEC_PER_SEC, 0); //每秒执行,后一个参数时间误差;

    dispatch_source_set_event_handler(_timer, ^{

         //在这里执行事件

    });

    dispatch_resume(_timer);


特点:GCD定时器是准确度最高的一种,可以精确到纳秒,而且不受RunLoopMode的影响;





0
0
查看评论

iOS-定时器的使用

一、NSTimer的使用- (void)createNSTimer {     // 调用创建方法后,target对象的计数器会加1,直到执行完毕,自动减1。如果是循环执行的话,就必须手动关闭,否则可以不执行释放方法     // 必须进行停止 —— 释放 [...
  • dec_9314
  • dec_9314
  • 2016-08-29 14:17
  • 594

oracle 创建定时器

DECLARE   no  number;    BEGIN   DBMS_JOB.SUBMIT(job => no, what =>'ORDER_JOB;',  next_date =...
  • haitun0921
  • haitun0921
  • 2013-11-22 13:09
  • 2197

windows api创建定时器模板

VOID CALLBACK LocalTimerProc (  HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)          {     SYSTEM...
  • DNVBYXK
  • DNVBYXK
  • 2017-02-02 16:50
  • 462

swift 定时器的启用

我们有时启用一个定时器来做一些事情,比如计时等。 启用一个计数,60秒,停止 Var timer = Timer() count =  0 timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #sele...
  • wangzbjy
  • wangzbjy
  • 2017-08-20 16:56
  • 326

iOS小技巧 - 利用GCD创建更加准确的定时器

NSTimer创建的定时器不是很准确,我们可以用GCD来创建一个准确的定时器 顺便提示一点:GCD不受RunLoop的影响(比如:scrollView在拖动的时候,定时器照样执行) @interface ViewController () /** * 定时器(这里不用带*,因为dispat...
  • lincsdnnet
  • lincsdnnet
  • 2016-04-15 19:48
  • 501

Win32 API中使用定时器的三种方法

1.SetTimer(HWND,UINT,UINT,TIMERPROC);第一个参数设置为捕获该定时消息的窗口句柄, 第二个参数是定时器的id,第三个是以毫秒为单位的定时长度,最后一个参数设置为NULL,可以使窗口的回调函数进行处理WM_TIMER消息。一般来说,在窗口创建时进行SetTimer调用...
  • fancycow
  • fancycow
  • 2011-08-10 15:57
  • 15216

ios-定时器解析

首先有两个方法我们去了解下就可以了,其实定时器有很多方法代码如下所示。这个方法就是重复的去调用work方法,然后我们不用去添加到运行循环中 _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selec...
  • ZCMUCZX
  • ZCMUCZX
  • 2017-11-23 00:59
  • 70

centos 定时器crontab 定时执行任务

crontab 执行定时任务的命令 定时任务格式 在文件、/etc/crontab文件夹有解释。 * * * * *  命令  文件 ; 分钟 小时 天  月 星期几 * * */3 * * /bin/sh remove.sh       ...
  • luosai19910103
  • luosai19910103
  • 2017-01-20 10:36
  • 1207

nginx定时器的实现

1.采用缓存数组的方式存储时间 1》虽然nginx现在没有采用多线程的方式,但是他还是考虑到了多线程情况下,一般是这俩种情况(1.多线程的方式2.一个进程在读时间的时候被信号中断,而那个信号里面会更新时间,这样导致读错误)所以nginx就采用了一个数组 cached_time[NGX_TIME_S...
  • wellwang1993
  • wellwang1993
  • 2016-04-15 10:12
  • 628

iOS-定时器的使用NSTimer

在iOS开始中,我们会使用到一些定时器来帮我们实现一个定时操作的效果,这个时候我们就可以使用NSTimer这个类来实现该效果。 举一个案例,图片轮播器,一般会在一些网购的APP使用该效果来轮循播放广告图片。 一般需要使用到的组件就是UIScrollView就行了,将要显示的图片加载进来,然后设置...
  • zmj132113
  • zmj132113
  • 2016-01-11 19:18
  • 148
    个人资料
    • 访问:55645次
    • 积分:1734
    • 等级:
    • 排名:千里之外
    • 原创:121篇
    • 转载:5篇
    • 译文:0篇
    • 评论:0条