• iOS中的3种定时器


    在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 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()方法。
    它是和屏幕刷新率同步,优点在于精确度高,适用于需要频繁更新UI的场景。
    CADisplayLink对象一旦创建就会运行,比较适合监控主线程UI卡顿。所以用做倒计时得场景下,更好的选择是使用DispatchSourceTimer定时器。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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执行耗时任务超过了调用时间,那么就会丢弃当前次,直接执行下一次。导致定时器不准时的情况。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var timer: Timer?
    func startCountdown() {
        //一般倒计时是操作UI,使用主队列
        timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
        // 定时器执行的操作
        }
    }
     
    deinit {
        timer.invalidate()
        timer = nil
    }

     

  • 相关阅读:
    Springboot整合RabbitMQ消息中间件
    IDEA创建Mybatis项目
    如何通过Photoshop将视频转换成GIF图片
    bat批处理脚本大全
    JAVA --- Set
    06数据结构与算法刷题之【字符串】篇
    搭建Nginx+Java环境
    常用数学分析和建模软件
    JS-Ajax
    构造函数和析构函数(个人学习笔记黑马学习)
  • 原文地址:https://www.cnblogs.com/zhou--fei/p/17389180.html