作者: Vong_HUSTarrow-up-right
从上一条 @Lefe_x 的分享我们知道 NSTimer 需要配合 runloop 使用,而且它计时是不精确的,同时处理不当的情况下会存在循环引用的情况。
@Lefe_x
NSTimer
runloop
今天和大家分享一下基于 GCD 的 Timer,它能解决掉刚刚提及到的 NSTimer 的三大问题。先来看一段示例代码,如图,具体解释已经包含在图中了。
GCD
Timer
但是使用 dispatch_suspend、dispatch_resume 这两个方法需要注意配对使用,不然可能会有意想不到的“惊(崩)喜(溃)”。值得一提的是 dispatch source 并没有提供用于检测 source 本身的挂起计数的 API,也就是说外部无法得知当前 source 状态。还有就是创建 timer 最好被持有,不然 dispatch_suspend 之后,如果没有被持有的话,就会 crash。
dispatch_suspend
dispatch_resume
dispatch source
source
API
timer
crash
当 dispatch_cancel 调用后,这个 timer 就失效了,类似 NSTimer 的 invalidate。
dispatch_cancel
invalidate
关于 GCD Timer 推荐一个开源库: SwiftTimer https://github.com/100mango/SwiftTimer
GCD Timer
SwiftTimer https://github.com/100mango/SwiftTimer
官方文档arrow-up-right
Last updated 7 years ago
Was this helpful?