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 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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野生的狒狒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值