Swift Timer не работает должным образом для старых iPhone моделей - PullRequest
1 голос
/ 08 апреля 2020

У меня проблема с таймером Swift. Таймер не работает должным образом для старых моделей iPhone, таких как iPhone 6. Когда я распечатываю время, таймер считает каждую 2 секунду как 1 секунду. Но если я изменю значение с TimeInterval на 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)
    }
}

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Таймеры не очень точные. Там точность составляет около 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)
            }
        })
    }
}

}

0 голосов
/ 08 апреля 2020

Я бы попробовал настроить его следующим образом.

var myTimer = Timer()
var counter = 0.0

myTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(yourTargetFunctionHere), userInfo: nil, repeats: true)

@objc func yourTargetFunctionHere() { 
     //in here is where you do all your code work
     counter += 0.1
     if counter == yourElapsedTime {
         //when your target time is hit do something here
     }
     if counter == finishedTime {
       self.timer.invalidate()
       self.counter = 0
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...