在iOS中有3种常见的定时器,它们可以根据不同的场景进行选择使用。

1.DispatchSourceTimer: 基于GCD实现。

2.CADisplayLink:基于屏幕刷新实现。

3.Timer:基于RunLoop实现。

DispatchSourceTimer定时器

DispatchSourceTimer定时器:

可以通过DispatchSource.makeTimerSource(queue: DispatchQueue.main)方法来创建。

然后通过schedule(deadline: .now(), repeating: .seconds(1))方法指定定时器的初始延迟时间和重复时间间隔,

然后设置了一个事件处理程序来处理定时器要执行的操作。

最后调用timer.resume()启动定时器。

如果停止定时器,可以调用timer.cancel()方法。

优点为:Dispatch定时器非常轻量级,基于GCD的实现,可以利用GCD的优势来进行任务调度,性能高。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

var timerDispatchSourceTimer?

func startCountdown() {

    //一般倒计时是操作UI,使用主队列

    timer DispatchSource.makeTimerSource(queueDispatchQueue.main)

    // //耗时操作放在全局队列,子线程处理

    // timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global())

    timer.schedule(deadline: .now(), repeating: .seconds(1))

    timer.setEventHandler {

        // 定时器执行的操作

    }

    timer.resume()

}

deinit {

    timer.cancel()

    timer nil

}

CADisplayLink定时器

CADisplayLink定时器:

可以通过CADisplayLink(target: self, selector: #selector(update))方法创建,

然后通过displayLink.add(to: .main, forMode: .common)方法将定时器添加到主运行循环中,并指定了运行模式,

然后定义一个update处理方法,该方法将在每个定时器周期中执行。

在对象销毁前停止定时器,可以调用displayLink.invalidate()方法。

它是和屏幕刷新率同步,优点在于精确度高,适用于需要频繁更新UI的场景。

CADisplayLink对象一旦创建就会运行,比较适合监控主线程UI卡顿。所以用做倒计时得场景下,更好的选择是使用DispatchSourceTimer定时器。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

var displayLinkCADisplayLink?

func startCountdown() {

    //一般倒计时是操作UI,使用主队列

    let displayLink CADisplayLink(targetselfselector: #selector(update))

    //设置多长时间回调一次,默认每次刷新都会调用,大概60ps, 这里设置1表示1s调用一次

    displayLink.preferredFramesPerSecond 1

    displayLink.add(to: .mainforMode: .common)

}

@objc func update() {

    // 定时器执行的操作

}

deinit {

    displayLink.invalidate()

    displayLink nil

}

Timer定时器

Timer定时器:

可以使用Timer.scheduledTimer方法创建,然后指定重复间隔和一个闭包作为定时器要执行的操作。

然后将返回的定时器对象存储在成员变量timer中。

要停止定时器,可以调用timer.invalidate()方法。

Timer是一个简单的定时器,基于RunLoop的,通常用于实现对实时性要求不高的场合,因为它被注册在runloop的timers事件源集合中,如果当前runloop执行耗时任务超过了调用时间,那么就会丢弃当前次,直接执行下一次。导致定时器不准时的情况。

1

2

3

4

5

6

7

8

9

10

11

12

var timerTimer?

func startCountdown() {

    //一般倒计时是操作UI,使用主队列

    timer Timer.scheduledTimer(withTimeInterval1.0repeatstrue) { timer in

    // 定时器执行的操作

    }

}

deinit {

    timer.invalidate()

    timer nil

}

iOS中的3种定时器相关推荐

  1. js中的两种定时器setTimeout()和setInterval()怎么用

    JS有两种定时器分别是setTimeout()和setInterval(),这两个区别就是setTimeout()是一次性的定时器,而setInterval()是循环的定时器. 定时器的精度 js中的 ...

  2. iOS中的两种搜索方式UISearchDisplayController和UISearchController

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 以前iOS的搜索一般都使用UISearchDisplayCon ...

  3. iOS中的两种主要架构及其优缺点

    凡是程序的开发者,应该对程序的架构都不陌生.一个程序的架构的好坏对这个程序有着非常重要的作用.今天我们来看一下iOS开发中用要的两种主流的程序架构.这个过程中我们主要以例子的形式展开. 我们来看第一种 ...

  4. iOS中的3种卡顿检测

    市面上的iOS卡顿分析方案有三种:监控FPS.监控RunLoop.ping主线程. 前面2个都比较熟悉,第三个是最近才了解到的. 方案一:监控FPS 一般来说,我们约定60FPS即为流畅.那么反过来, ...

  5. Linux中的几种定时器

    0. 前言 在linux系统中定时器有分为软定时和硬件定时器.硬件定时器一般指的是CPU的一种底层寄存器,它负责按照固定时间频率产生中断信号,形成信号源.基于硬件提供的信号源,系统就可以按照信号中断来 ...

  6. Qt分析:Qt中的两种定时器

    QTimer类的定时器 QTimer类定时器是QObject类定时器的扩展版或者说升级版,因为它可以提供更多的功能.比如说,它支持单次触发和多次触发. 使用QTimer类定时器的步骤: (1)创建一个 ...

  7. iOS中实现打电话、发短信

    电话.短信是手机的基础功能,iOS中提供了接口,让我们调用.这篇文章简单的介绍一下iOS的打电话.发短信在程序中怎么调用. 1.打电话 [cpp]  view plain copy print ? [ ...

  8. iOS中的CADisplayLink定时器

    2019独角兽企业重金招聘Python工程师标准>>> iOS中的CADisplayLink定时器 说到定时器,在iOS中最常用的为NSTimer类,其实CADisplayLink类 ...

  9. iOS中的三大定时器

    iOS开发中定时器经常会用到,iOS中常用的定时器有三种,分别是NSTime,CADisplayLink和GCD. NSTimer 方式1 // 创建定时器NSTimer *timer = [NSTi ...

最新文章

  1. ERP系统成功选型的三个技巧
  2. Kotlin实战指南七:单例模式
  3. 零元学Expression Blend 4 ndash; Chapter 21 以实作案例学习MouseDragElementBehavior
  4. hystrix熔断 简介_Hystrix简介–总结
  5. 跨站脚本专题 XSS
  6. equals()与==的区别
  7. OpenGL ES入门
  8. linux apache目录权限配置,Linux下Apache网站目录读写权限的设置
  9. 温度记录仪开发_TinkerNode NBIoT物联网开发板
  10. 关于一些nginx的高级扩展应用
  11. setState的参数接收函数
  12. 用Lucene[1].net对数据库建立索引及搜索+
  13. python整数运算定律_PHP 操作redis 详细讲解
  14. 职称计算机 河南,2017年河南职称计算机报名入口
  15. apimanager-wso2-OKD-deploy
  16. 日语学习网站分类汇总
  17. Flutter中使用connectivity实现网络检测
  18. 网卡扫盲一:网卡初步认识
  19. ctfshow 网络迷踪-给你拷上
  20. 鸿蒙陶瓷制造中心,法库县陶瓷创意中心

热门文章

  1. 思己录-5:我对体验的理解
  2. C++——多项式拟合
  3. C语言中,printf、sprintf、fprintf之间的区别及用法举例
  4. 【NLP】智能问答系统
  5. 前端学习———用css实现顶部导航条及下拉框
  6. 利用物镜对二极管激光器光束进行准直
  7. director.js:客户端的路由---简明中文教程
  8. python换行符怎么键入_python的换行符是什么?
  9. [飞腾]Trace32使用概述
  10. python中if的用法