I'm adapting my app to Swift 3 and I'm encountering this problem. This used to work on Swift 2.2 but now it's broken. moviePlayBackFinished never gets called. I tried adding the observer in multiple ways, all without success.
NotificationCenter.default.addObserver(self, selector: #selector(self.moviePlayBackFinished(_:)),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem);
NotificationCenter.default.addObserver(self, selector: #selector(moviePlayBackFinished(_:)),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem);
NotificationCenter.default.addObserver(self, selector: #selector(self.moviePlayBackFinished(sender:)),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem);
// (...)
@objc func moviePlayBackFinished(sender : AnyObject) {
print("playbackFinished");
let zeroCM : CMTime = CMTime(seconds: 0, preferredTimescale: 1000000000);
playerLayer.player?.seek(to: zeroCM);
}
@objc func moviePlayBackFinished(_ notification: Notification) {
print("playbackFinished");
let zeroCM : CMTime = CMTime(seconds: 0, preferredTimescale: 1000000000);
playerLayer.player?.seek(to: zeroCM);
}
Any ideas would be appriciated.
Thank you
There are multiple possible reason of this issue.
NotificationCenter
.default
.addObserver(self,
selector: #selector(self.moviePlayBackFinished(sender:)),
name: .AVPlayerItemDidPlayToEndTime,
object: player.currentItem)
First of all, you have to set object to nil. AVPlayerItemDidPlayToEndTime notification automatically set object to the AVPlayerItem which reached at the end. If you change it manually, you will not get any notification of AVPlayerItemDidPlayToEndTime.
Second, according to the AVPlayerItemDidPlayToEndTime documentation:
Important
This notification may be posted on a different thread than the one on which the observer was registered.
So, to make sure you should check the notification is on the thread you want.
It doens't matter you added observer from UIViewController or AVPlayer subclass.
use this code..
NotificationCenter.default.addObserver(self, selector: #selector(detailViewController.playw), name:NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
playw is function name you have to make function like
func playw(){
//do here whatever you want to do
}
Still you've any problem you can ask me.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With