iOS中的3种定时器汇总介绍

 更新时间:2023年05月11日 08:14:54   作者:滴水微澜  
这篇文章主要介绍了iOS中的3种定时器汇总介绍的相关资料,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

在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种定时器汇总介绍的文章就介绍到这了,更多相关iOS中的3种定时器内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • iOS开发系列--通知与消息机制详解

    iOS开发系列--通知与消息机制详解

    这篇文章主要介绍了iOS开发系列--通知与消息机制详解,有需要的同学可以了解一下。
    2016-11-11
  • iOS中读写锁的简单实现方法实例

    iOS中读写锁的简单实现方法实例

    读写锁是计算机程序的并发控制的一种同步机制,也称“共享-互斥锁”、多读者-单写者锁,读操作可并发重入,写操作是互斥的,这篇文章主要给大家介绍了关于iOS中读写锁的简单实现方法,需要的朋友可以参考下
    2021-11-11
  • iOS中只让textField使用键盘通知的实例代码

    iOS中只让textField使用键盘通知的实例代码

    本文通过实例代码给大家介绍了OS中只让textField使用键盘通知的操作方法,代码简单易懂,非常不错,具有参考借鉴加载,需要的的朋友参考下吧
    2017-07-07
  • iOS中设置网络超时时间+模拟的方法详解

    iOS中设置网络超时时间+模拟的方法详解

    这篇文章主要介绍了在iOS中设置网络超时时间+模拟的方法,文中介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来跟着小编一起来学习学习吧。
    2017-04-04
  • iOS 实现简单的加载等待动画示例(思路与实现)

    iOS 实现简单的加载等待动画示例(思路与实现)

    本篇文章主要介绍了iOS 实现简单的加载等待动画示例(思路与实现),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • iOS如何获取手机的Mac地址

    iOS如何获取手机的Mac地址

    这篇文章主要为大家详细介绍了iOS获取手机的Mac地址的多种方法,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • iOS实现数字倍数动画效果

    iOS实现数字倍数动画效果

    在iOS开发中,制作动画效果是最让开发者享受的环节之一,下面这篇文章主要给大家介绍了关于iOS实现数字倍数动画效果的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • iOS中使用RSA加密详解

    iOS中使用RSA加密详解

    本文主要介绍了iOS中使用RSA加密的方法,具有一定的参考价值,下面跟着小编一起来看下吧
    2016-12-12
  • iOS中使用UISearchBar控件限制输入字数的实现方法

    iOS中使用UISearchBar控件限制输入字数的实现方法

    这篇文章主要介绍了iOS中使用UISearchBar控件限制输入字数的实现方法的相关资料,需要的朋友可以参考下
    2016-08-08
  • iOS应用程序中通过dispatch队列控制线程执行的方法

    iOS应用程序中通过dispatch队列控制线程执行的方法

    Grand Central Dispatch简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统,iOS应用程序中通过dispatch队列控制线程执行则是以并发来达到多核优化的重要途径.
    2016-05-05

最新评论

?


http://www.vxiaotou.com