首页 > 解决方案 > 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)
    }
}

标签: swiftconcurrencytimer

解决方案


计时器不是很精确。我认为精度约为 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)
            }
        })
    }
}

}


推荐阅读