在iOS中有3种常见的定时器,它们会根据不同的场景进行选择使用。
1.DispatchSourceTimer: 基于GCD实现。
2.CADisplayLink:基于屏幕刷新实现。
3.Timer:基于RunLoop实现。
DispatchSourceTimer定时器
DispatchSourceTimer定时器可以通过DispatchSource.makeTimerSource(queue: DispatchQueue.main)方法来创建,并且
使用GCD创建了一个DispatchSource类型的定时器,并使用全局队列来运行它。通过schedule(deadline: .now(), repeating: .seconds(1))方法指定定时器的初始延迟和重复时间,然后设置了一个事件处理程序来定义定时器要执行的操作。
最后timer.resume()启动定时器。
要停止定时器,可以调用timer.cancel()方法。
优点为:Dispatch定时器非常轻量级,基于GCD的实现,可以利用GCD的优势来进行任务调度,性能高。
var timer: DispatchSourceTimer?
func startCountdown() {
//一般倒计时是操作UI,使用主队列
timer = DispatchSource.makeTimerSource(queue: DispatchQueue.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()方法。
CADisplayLink对象一旦创建就会运行,比较适合监控主线程UI卡顿,用做倒计时不如使用DispatchSourceTimer
它是和屏幕刷新率同步,优点在于精确度高,适用于需要频繁更新UI的场景。
var displayLink: CADisplayLink?
func startCountdown() {
//一般倒计时是操作UI,使用主队列
let displayLink = CADisplayLink(target: self, selector: #selector(update))
//设置多长时间回调一次,默认每次刷新都会调用,大概60ps, 这里设置1表示1s调用一次
displayLink.preferredFramesPerSecond = 1
displayLink.add(to: .main, forMode: .common)
} @objc func update() {
// 定时器执行的操作
} deinit {
displayLink.invalidate()
displayLink = nil
}
Timer定时器
Timer定时器可以使用Timer.scheduledTimer方法创建,然后指定重复间隔和一个闭包作为定时器要执行的操作。并且将返回的定时器对象存储在变量timer中。
要停止定时器,可以调用timer.invalidate()方法。
Timer是一个简单的定时器,基于RunLoop的,通常用于实现对实时性要求不高的场合,因为它被注册在runloop的timers事件源集合中,如果当前runloop执行耗时任务超过了调用时间,那么就会丢弃当前次,直接执行下一次。导致定时器不准时的情况。
var timer: Timer?
func startCountdown() {
//一般倒计时是操作UI,使用主队列
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
// 定时器执行的操作
}
} deinit {
timer.invalidate()
timer = nil
}

iOS中的3种定时器的更多相关文章

  1. iOS中的三种定时器

    iOS中的三种定时器 NSTimer 一.背景 定时器是iOS开发中经常使用的,但是使用不慎会造成内存泄露,因为NSTimer没有释放,控制器析构函数dealloc也没有调用,造成内存泄露. 二.使用 ...

  2. iOS中的几种定时器详解

    在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,经过查阅资料,大概有三种方法: ...

  3. IOS开发数据存储篇—IOS中的几种数据存储方式

    IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09  421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...

  4. ios中的几种多线程实现

    iOS 支持多个层次的多线程编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法.下面根据抽象层次从低到高依次列出iOS所支持的多线程编程范式:1, Thread;2, Cocoa ...

  5. iOS:iOS中的几种动画

    本文来自收藏,感谢原创博主. iOS中的动画 摘要 本文主要介绍核iOS中的动画:核心动画Core Animation, UIView动画, Block动画, UIImageView的帧动画. 核心动 ...

  6. iOS中的几种锁的总结,三种开启多线程的方式(GCD、NSOperation、NSThread)

    学习内容 欢迎关注我的iOS学习总结--每天学一点iOS:https://github.com/practiceqian/one-day-one-iOS-summary OC中的几种锁 为什么要引入锁 ...

  7. Qt分析:Qt中的两种定时器(可是QObject为什么要提高定时器呢,没必要啊。。。)

    Qt有两种定时器,一种是QObject类的定时器,另一种是QTimer类的定时器.   (1)QObject类的定时器   QObject类提供了一个基本的定时器,通过函数startTimer()来启 ...

  8. iOS中的两种主要架构及其优缺点浅析

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

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

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

  10. ios中的三种弹框《转》

    目前为止,已经知道3种IOS弹框: 1.系统弹框-底部弹框 UIActionSheet  (1)用法:处理用户非常危险的操作,比如注销系统等 (2)举例: UIActionSheet *sheet = ...

随机推荐

  1. H. Permutation Counting 判环,计数,拓扑

    H. Permutation Counting 2022/7/28 传送门:https://codeforces.com/group/5zHJ4CTyoU/contest/392060/problem ...

  2. element-ui el-tree 内容过多出现横向滚动条

    /deep/ .el-tree>.el-tree-node { display: inline-block; min-width: 100%;}

  3. python 调试 qml

    1.设置pycharm的parameters -qmljsdebugger=port:10002,block 2.python 启动调试: 点击debug按钮 3.设置qt creater qt cr ...

  4. ssh双击互信

    默认公钥文件/root/.ssh/id_rsa.pub默认私钥文件/root/.ssh/id_rsa 只有将公钥文件文件拷到其他的服务器上才能登录别的服务器.   服务器A 192.168.1.133 ...

  5. Centos7安装nodejs(npm)

    执行命令: 设置yum安装源> curl --silent --location https://rpm.nodesource.com/setup_14.x | sudo bash (14是大的 ...

  6. 不同时间格式转换问题_python2

    def unix_to_cst(data): """2019-03-17 11:00:00 --> Sun, 17 Mar 2019 11:00:00 GMT+08 ...

  7. OSPF与ISIS比较

  8. 解密Prompt系列3. 冻结LM微调Prompt: Prefix-Tuning & Prompt-Tuning & P-Tuning

    这一章我们介绍在下游任务微调中固定LM参数,只微调Prompt的相关模型.这类模型的优势很直观就是微调的参数量小,能大幅降低LLM的微调参数量,是轻量级的微调替代品.和前两章微调LM和全部冻结的pro ...

  9. Django+bootstrap+layui集成

    一.django项目搭建:1.Python安装2.下载Django解压到Python安装目录G:\python3.7.4\3.cmd G:\python3.7.4\Django-4.0.5 执行 py ...

  10. PMP常见会议小结

    转载请注明出处: 会议是吸引项目团队和其他干系人参与的重要方式.它们是整个项目的主要沟通方式. 一. 项目启动会 召开时间:是启动阶段结束时召开的会议. 主要任务:发布项目章程,并任命项目经理,赋予项 ...