Я пытаюсь реализовать простой плеер с UISlider, чтобы указать, в какое время находится текущий аудиофайл.
В коде я добавил двух наблюдателей:
slider.rx.value.subscribe(onNext: { value in
let totalTime = Float(CMTimeGetSeconds(self.player.currentItem!.duration))
let seconds = value * totalTime
let time = CMTime(seconds: Double(seconds), preferredTimescale: CMTimeScale(NSEC_PER_SEC))
self.player.seek(to: time)
}).disposed(by: bag)
let interval = CMTime(seconds: 0.1, preferredTimescale: CMTimeScale(NSEC_PER_SEC))
player.addPeriodicTimeObserver(forInterval: interval, queue: nil) { [weak self] time in
self?.updateSlider(with: time)
}
с одной частной функцией:
private func updateSlider(with time: CMTime) {
let currentTime = CMTimeGetSeconds(time)
var totalTime = CMTimeGetSeconds(player.currentItem!.duration)
if totalTime.isNaN {
totalTime = 0
}
startLabel.text = Int(currentTime).descriptiveDuration
endLabel.text = Int(totalTime).descriptiveDuration
slider.value = Float(currentTime / totalTime)
}
Когда воспроизводится звук, все в порядке, и слайдер в значительной степени обновляется. Проблема возникает, когда я пытаюсь переместить ползунок вручную во время воспроизведения звука, затем он прыгает. Почему?
UPDATE:
Я знаю, почему на самом деле. Потому что я обновляю его дважды: вручную и от игрока-наблюдателя, но как предотвратить такое поведение? Понятия не имею;) Пожалуйста, помогите.