//Reactive를 확장시켜준다.
//단, 확장의 범위를 제한시켜주는 것이 좋다.
extension Reactive where Base: AVPlayer {
var currentStatus: Observable<AVPlayer.Status> {
// KVO(Key-Value Observing)를 사용하여, AVPlayer.Status의 변화가 발생하면 이벤트 방출
return observe(AVPlayer.Status.self, #keyPath(AVPlayer.status))
.map { $0 ?? .unknown }
.distinctUntilChanged()
}
}
func addPlayerObserver() {
let interval = CMTime(value: 1, timescale: 10)
if timeObserverToken == nil {
timeObserverToken = player.addPeriodicTimeObserver(forInterval: interval, queue: .main, using: { [weak self] _ in
guard let owner = self else { return }
let status = owner.fetchStatus()
owner.isReady.onNext(status)
})
}
}
func removePlayerObserver() {
if let token = timeObserverToken {
player.removeTimeObserver(token)
timeObserverToken = nil
}
}