在开发过程中,Timer可以说是比较常见的了,用来做一些定时性的操作。可实际过成功,Timer的时间真的准吗?下面写几个代码来做验证。
1、Timer
timer = Timer.scheduledTimer(timeInterval: 1.0, target:self, selector: #selector(timerTest), userInfo: nil, repeats: true)
@objc func timerTest() {
print("timer info - (Date.init())")
}
timer info - 2020-10-28 05:02:33 +0000
timer info - 2020-10-28 05:02:34 +0000
timer info - 2020-10-28 05:02:35 +0000
timer info - 2020-10-28 05:02:36 +0000
看结果还是比较准备的,不妨加大量继续测试。在输入时加一些耗时操作。
@objc func timerTest() {
var count = 0
for index in 0..<100000 {
count += 1
}
print("timer info - (Date.init())")
}
timer info - 2020-10-28 05:04:20 +0000
timer info - 2020-10-28 05:04:21 +0000
timer info - 2020-10-28 05:04:22 +0000
timer info - 2020-10-28 05:04:23 +0000
timer info - 2020-10-28 05:04:24 +0000
timer info - 2020-10-28 05:04:25 +0000
timer info - 2020-10-28 05:04:26 +0000
还可以嘛!结果依然看起来挺对的,那就继续加大工作量。再测试:
@objc func timerTest() {
var count = 0
for index in 0..<10000000 {
count += 1
}
print("timer info - (Date.init())")
}
timer info - 2020-10-28 05:05:19 +0000
timer info - 2020-10-28 05:05:23 +0000
timer info - 2020-10-28 05:05:27 +0000
timer info - 2020-10-28 05:05:31 +0000
这时候结果就明显了,我要求的定时是1秒钟,可间隔出现了竟然4秒了。这跟我要求的就相差很大了。可这是怎么出现的呢?
原因分析:
定时器被添加在主线程中,由于定时器在一个RunLoop中被检测一次,所以如果在这一次的RunLoop中做了耗时的操作,当前RunLoop持续的时间超过了定时器的间隔时间,那么下一次定时就被延后了。
解决办法:
1、在子线程中创建timer,在主线程进行定时任务的操作
2、在子线程中创建timer,在子线程中进行定时任务的操作,需要UI操作时切换回主线程进行操作
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { (timer) in
print("timer info - (Date.init())")
}
2、RunLoop模式的影响
为了验证,我们在当前页面上添加一个tableview,在定时器运行时,我们对tableview进行滑动操作,可以发现,定时器并不会触发下一次的定时任务。
原因分析:
主线程的RunLoop有两种预设的模式,RunLoopDefaultMode和TrackingRunLoopMode。
当定时器被添加到主线程中且无指定模式时,会被默认添加到DefaultMode中,一般情况下定时器会正常触发定时任务。但是当用户进行UI交互操作时(比如滑动tableview),主线程会切换到TrackingRunLoopMode,在此模式下定时器并不会被触发。
解决方法:
原文地址:https://blog.csdn.net/Landen2011/article/details/125603732
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_29240.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!