Может понравиться следующее (не используйте static
, в этом случае это не нужно, в любом случае вам понадобится экземпляр для использования в @ObservedObject
)
Конечно, это не финал Player
, но направление развития должно быть ясным:
class Player: AVPlayer, ObservableObject {
@Published var isPlaying: Bool = false
private var playerContext = 0
var player: AVPlayer? = nil
var episodeId: Int?
func playItem(at itemURL: String, episodeId: Int) {
guard let url = URL(string: itemURL) else { return }
// cleanup for previous player
self.player?.removeObserver(self, forKeyPath: "timeControlStatus")
// setup new player
let newPlayer = AVPlayer(url: url)
newPlayer.addObserver(self, forKeyPath: "timeControlStatus", options: [.old, .new], context: &playerContext)
self.player = newPlayer
self.episodeId = episodeId
}
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?) {
guard context == &playerContext else { // give super to handle own cases
super.observeValue(forKeyPath: keyPath,
of: object,
change: change,
context: context)
return
}
if self.player?.timeControlStatus == .playing {
self.isPlaying = true
}
}
}