Класс CADisplayLink
, который автоматически вызывает определяемый вами метод, как только происходит перерисовка экрана
Timer
не обеспечивает точного срабатывания и может дрейфовать раньше или позже, чем запрошенные обновления, а также не имеет представления о перерисовках экрана и поэтому может с радостью запустить 10 мсек после перерисовки экрана.
let displayLink = CADisplayLink(target: self,
selector: #selector(update))
displayLink.add(to: .current, forMode: .common)
@objc func update() {
let currentTime = avAudioPlayer.currentTime
let totalTime = avAudioPlayer.duration
let progress = currentTime / totalTime
}