Nuke icon indicating copy to clipboard operation
Nuke copied to clipboard

VideoPlayerView notifications don't appear to be removed

Open sureshjoshi opened this issue 1 year ago • 2 comments

I noticed that registerNotifications is called every time the player is set, which happens both on play and on reset.

    private var player: AVPlayer? {
        didSet {
            registerNotifications()
        }
    }

Should this didSet have an unregisterNotifications for when you set nil maybe?

I'm running into a problem where I incessantly have onVideoFinished called every time reset and play a video.

    func play() {
        if let player = videoView.playerLayer.player{
            player.play()
        } else {
            // First run
            videoView.isLooping = configuration?.shouldLoop ?? videoView.isLooping
            videoView.onVideoFinished = { 
                print("onVideoFinished")
            }
            videoView.play()
        }

Every time I close and open/play, I get progressively more logs of onVideoFinished

sureshjoshi avatar Oct 02 '24 16:10 sureshjoshi

As an example, I just scrolled through a handful of videos in a collection view, and when I played my next video, I had about 50 onVideoFinished queued up and printed 🤯

I'm sure this has to do with my views being cached, but I'm also wiping out the handler during cleanup, so it's all strange 😆

sureshjoshi avatar Oct 02 '24 16:10 sureshjoshi

Note: I don't have a full fix yet, but as a quick workaround, I'm manually calling NotificationCenter.default.removeObserver(videoView) after I reset the videoView, and also when I'm doing any cleanup in prepareForReuse or elsewhere.

That has mitigated the problem for the most part today. Will come back to this when I get to re-factor that part of my code in the next few months.

sureshjoshi avatar Oct 02 '24 17:10 sureshjoshi