swift中定时器(Timer) 的使用

swift中定时器(Timer) 的使用,第1张

Timer与NSTimer的使用注意:

1、由于ios是通过runLoop作为消息循环机制,主线程默认启动了runLoop,可是子线程没有默认的runLoop,因此在子线程启动runLoop即可。

2、runLoop的mode问题

如果timer是add到defaultRunLoopMode中,会出现滑动中UITrackingRunLoopMode得不到调度,导致定时器失效。

因为UITrackingRunLoopMode和KCFRunLoopDefaultMode都标记了common模式,所以可通过将timer添加到runLoopCommonModes实现在默认和追踪模式都能正常运行。

3、dealloc和定时结束时执行invalidate,置空timer。避免内存泄漏

在iOS中我们常用的定时器有三种: Timer, CADisplayLink, DispatchSourceTimer

Timer是我们最常见的定时器,当定时器创建完(不用 scheduled 的,需要手动添加到 runloop 中)后,该定时器将在初始化时指定的 t 秒后自动触发。我们经常围绕它的俩个问题是 精度 循环引用 问题。

如果Timer是加在main runloop中,就很容易因为主线程忙于各种UI *** 作或者复杂的运算导致阻塞线程,从而使得NSTimer延迟执行,导致精度较低。

Timer如果想要更高点的精度,我们可以从以下几个方面考虑

我们知道Timer的调用有target-action和block俩种方式,其中target-action会导致循环引用,造成内存泄露的问题, 因为target, action,runLoop之间有强引用链导致,解决办法

1.使用block回调方式

2.使用NSProxy类作为中间对象

CADisplayLink通过和屏幕刷新相同的频率将内容显示到屏幕上。也是依赖于NSRunLoop运行,iOS设备的屏幕刷新频率是固定的,CADisplayLink在通常都会在在每次刷新结束调用,精度较高,更适合做屏幕刷新等

DispatchSourceTimer精度很高,因为是系统级别,且是不受RunLoop影响。

常见基础用法


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11930343.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存