美文网首页
swift3中使用GCD做倒计时

swift3中使用GCD做倒计时

作者: wsxiaoluob | 来源:发表于2017-06-13 18:34 被阅读0次

群里有人提到这个,各种抱怨NSTimer在runloop下的问题,还有内存问题,有人提到可以用GCD做倒计时,上网查了下写了个demo,这里记录下:

重点API:DispatchSourceTimer

这个协议是没有init的,初始化方法是DispatchSource.makeTimerSource()

setEventHandler:这个不说了,直接在closure里写执行代码

cancel():停止

scheduleRepeating(deadline:interval:) :暂时只看了这一个schedule方法,其他的还没看,第一个参数是开始时间,可以直接.now(),第二个参数是间隔。

resume:开始计时

直接上正确代码

正确的demo

基本用法说完了,下面说一下内存问题,GCD的这个计时器的内存问题实在太干净了,和NSTimer那个在runloop上面跑的又有循环引用问题的妖艳贱货不一样。

注意看上面的t的内存释放问题,大家知道在ARC里,栈帧内存在方法执行完之后会释放掉,里面的临时变量都会释放,这里的t变量很明显就是个纯的临时变量,但是t自己的closure里引用了t自己,所以在这段代码的方法执行完之后,t不会立即释放,会等到eventHandler释放之后再释放,完美!

如果把这一句t.cancel()去掉,那么在外部代码执行完之后t会立即释放,t释放之后自然eventHandler也不会继续跑了,这一点在使用的时候要注意。

那么如果在closure里不需要引用这个t而且又不想让t提前释放怎么办呢?

提升作用域嘛,最简单的话加一个self.t = t就行了。

6月20日更新

发现一个问题,那就是默认在执行timer的handler的时候,不是在主线程中的!!如果在计时过程中有涉及UI相关的刷新,务必加上DispatchQueue.main.async。

相关文章

  • Swift3使用GCD和DispatchQueues关于gcd

    关于对gcd 的使用,有几个链接写的还是相当不错的。Swift3使用GCD和DispatchQueueshttp:...

  • swift3中使用GCD做倒计时

    群里有人提到这个,各种抱怨NSTimer在runloop下的问题,还有内存问题,有人提到可以用GCD做倒计时,上网...

  • GCD-倒计时的使用

    GCD 倒计时 使用

  • iOS开发-Swift3中GCD的使用

    GCD作为iOS开发中多线程实现的一种重要方式,在swift3针对GCD的使用做了一些改进,使其更加面向对象了,在...

  • Swift3中的 GCD

    第一次翻译文章,水准真是不忍直视,各位轻拍.....原文链接 多线程和并发是当今APP中的必备因素,但是在 iOS...

  • iOS自定义按钮 - 发送验证码按钮

    效果图 倒计时定时器 使用的是GCD定时器 -- GCD定时器 防止恶意点击 其中设置了倒计时时间记录,无论是p...

  • Swift-GCD

    本篇文章介绍的是在Swift3语言下的GCD应用操作,针对的目标读者可以是没有GCD基础的初学者,也可以是对GCD...

  • iOS开发之倒计时显示(GCD)

    1.关于GCD倒计时,实际开发中遇到的问题在于线程使用,要知道倒计时每次改变都是在主线程对按钮的UI进行重新绘制,...

  • Swift3 GCD

    Swift3 的gcd变化很大,这里列举一下,大家可以有个对照: 1、Create a serial queue ...

  • iOS开发-使用GCD机制来实现倒计时功能

    使用GCD机制来实现倒计时功能。实现的是类似注册页面发送验证码的倒计时。 - (void)getCodeSucce...

网友评论

      本文标题:swift3中使用GCD做倒计时

      本文链接:https://www.haomeiwen.com/subject/psqjqxtx.html