swift - Swift Timer 不适用于旧 iPhone 型号
问题描述
我遇到了 Swift 计时器的问题。计时器不适用于 iPhone 6 等旧 iPhone 型号。当我打印出时间时,计时器每 2 秒计数 1 秒。但如果我将 withTimeInterval 更改为 0.05,效果会好一些。但仍然不是现实生活中的工作时间。这是我的代码。谁能帮我 ?
weak var timer: Timer?
var startTime : TimeInterval!
var elapsingTime: Double = 0.0
func configureTimer(totalSecond: Double) {
startTime = Date().timeIntervalSinceReferenceDate
self.invalidateTimer()
DispatchQueue.main.async {
self.timer = Timer.scheduledTimer(timeInterval: 0.02,target: self,selector: #selector(self.advanceTimer(timer:)),userInfo: nil,repeats: true)
}
}
@objc func advanceTimer(timer: Timer) {
elapsingTime += 0.02
self.questionView.configureProgressBar(totalTime: Double(self.totalSecond), elapsingTime: elapsingTime)
self.isTimeExpired = false
self.elapsingTime = Date().timeIntervalSinceReferenceDate - self.startTime
if Int(elapsingTime) == Int(totalSecond) {
self.timer!.invalidate()
self.isTimeExpired = true
self.userAnswerIndex = -1
self.sendAnswer(index: self.userAnswerIndex, isTimeExpired: self.isTimeExpired)
}
}
解决方案
计时器不是很精确。我认为精度约为 0.05 秒。如果一个过程需要大量的能量,你的计时器会更慢。解决方案可以是在您启动计时器时节省时间,并且每次计时器触发时,您都会进行数学运算以了解经过了多少时间:
class YourClass {
var startTime : TimeInterval!
//...
func configureTimer() {
startTime = Date().timeIntervalSinceReferenceDate //You add this line
elapsingTime = 0.0
timer?.invalidate()
DispatchQueue.main.async {
self.timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true, block: { [weak self] timer in
guard let self = self else { return }
self.elapsingTime = Date().timeIntervalSinceReferenceDate - self.startTime //You change this one
self.questionView.configureProgressBar(totalTime: self.totalTime, elapsingTime: self.elapsingTime)
self.questionView.videoQuestionPlayer.player?.play()
if Int(self.elapsingTime) == Int(self.totalTime) {
self.timer!.invalidate()
self.isTimeExpired = true
self.sendAnswer(index: -1)
}
})
}
}
}
推荐阅读
- sql - 通过 SQL EXTRACTVALUE 命名空间 XML 的 XPath 失败?
- c++ - cURL setopt CONNECTTIMEOUT 与 TIMEOUT
- xamarin.forms - 如何以编程方式从 Android 设备中检索已安装的证书(Xamarin)
- android - 如何正确地将数据从 Android 发送到 Flutter?
- vue.js - 调用 Vuex 突变需要太多时间来加载内容和突变
- c++ - 逻辑运算符 || 和 && 的区别 - 我一直在犯错误
- javascript - 协助展平包含一个对象(或可能超过 1 个)的对象数组
- ffmpeg - ffmpeg - 一次执行 2 个或更多命令
- node.js - 如何捆绑环境依赖包?
- matplotlib - 记录互动情节