我需要将玩家置于循环中,但为什么在我添加
时NotificationCenter.default.addObserver(forName:NSNotification.Name.AVPlayerItemDidPlayToEndTime,object: nil, queue:nil){
notification in
videoPlayer.seek(to: KCMTimeZero)
videoplayer.play()
}
}
当我在viewController中给予dismiss时,我的视图留在内存中。 我如何重现视频,每次打开ViewController
时,我的记忆都会增加如果没有这个代码,它就会被删除。
我不知道自己要做什么
你能帮我吗?
答案 0 :(得分:5)
您的代码有三个问题:
默认情况下,引用作为强传递到块中。要确保不保留这些内容,请使用weak
或unowned
:
NotificationCenter.default.addObserver(forName:NSNotification.Name.AVPlayerItemdidPlayToEndTime,object: nil, queue:nil){
[weak videoPlayer] notification in
videoPlayer?.seek(to: KCMTimeZero)
videoplayer?.play()
}
从iOS 9开始,观察者不需要从NotificationCenter
中删除,除非您正在使用块观察者(您是)。您应该将引用存储到从NotificationCenter.addObserver:forName:object:queue:usingBlock:
返回的观察者:
self.observer = NotificationCenter.default.addObserver(...)
和viewWillDissappear
:
NotificationCenter.default.removeObserver(self.observer)
(或者,您可以使用选择器,正如Chan Jing Hong所指出的那样;在这种情况下,不再需要删除观察者,但根据您应用的逻辑可能需要删除观察者)
NSNotification.Name.AVPlayerItemdidPlayToEndTime
的方式,只要任何 AVPlayerItem
的播放到达结尾,您就会收到通知。为避免潜在问题,请收听当前播放项目的通知(将object:nil
替换为object: playerItem
)答案 1 :(得分:1)
添加到NotificationCenter时,您应该将self设置为观察者。
NotificationCenter.default.addObserver(self, selector: #selector(self.playerItemDidReachedEnd(_:)), name: Notification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
这样,在您的viewWillDisappear
中,您可以执行removeObserver()
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
}