NSNotification 被解雇了不止一次?
NSNotification being fired off more then one time?
我正在为测试项目创建示例播放器。我创建了一个 NSNotification 来调用一个函数来播放数组中的下一个音轨。问题是通知连续调用此函数大约 8 次?我不知道为什么会这样。这是我的代码,感谢您的帮助!
let player = AVPlayer()
var urlPlayerItems = [String]()
var currentTrack: Int = 0
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Checks to see if player reached end
NotificationCenter.default.addObserver(self,
selector: #selector(PlayerViewController.autoplayNextTrack(notification:)),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
object: player.currentItem)
}
func playTrack() {
if urlPlayerItems.count > 0 {
let newMovieURL = URL(string: urlPlayerItems[currentTrack])!
asset = AVURLAsset(url: newMovieURL, options: nil)
player.play()
}
}
func autoplayNextTrack(notefication: NSNotification) {
if (currentTrack + 1) >= urlPlayerItems.count {
currentTrack = 0
} else {
currentTrack += 1
}
playTrack()
}
如果您在 viewDidAppear 方法中添加观察者,您需要确保只添加它们 ONCE。 viewDidAppear 方法将被调用多次。
简单的方法就是制作一个 BOOL 并在你有 added/removed 时标记它。
编辑:
另外,我没有看到任何可以在代码中任何地方删除观察者的方法,请确保在您想停止观察时也将其删除。
示例:
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
或在您的 viewWillDissapear 方法中。
除了不应该多次设置观察者这一事实之外,我认为您应该在再次调用播放函数之前将播放器重置为零
func autoplayNextTrack(notefication: NSNotification) {
player.seekToTime(kCMTimeZero)
if (currentTrack + 1) >= urlPlayerItems.count {
currentTrack = 0
} else {
currentTrack += 1
}
playTrack()
}
我正在为测试项目创建示例播放器。我创建了一个 NSNotification 来调用一个函数来播放数组中的下一个音轨。问题是通知连续调用此函数大约 8 次?我不知道为什么会这样。这是我的代码,感谢您的帮助!
let player = AVPlayer()
var urlPlayerItems = [String]()
var currentTrack: Int = 0
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Checks to see if player reached end
NotificationCenter.default.addObserver(self,
selector: #selector(PlayerViewController.autoplayNextTrack(notification:)),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
object: player.currentItem)
}
func playTrack() {
if urlPlayerItems.count > 0 {
let newMovieURL = URL(string: urlPlayerItems[currentTrack])!
asset = AVURLAsset(url: newMovieURL, options: nil)
player.play()
}
}
func autoplayNextTrack(notefication: NSNotification) {
if (currentTrack + 1) >= urlPlayerItems.count {
currentTrack = 0
} else {
currentTrack += 1
}
playTrack()
}
如果您在 viewDidAppear 方法中添加观察者,您需要确保只添加它们 ONCE。 viewDidAppear 方法将被调用多次。
简单的方法就是制作一个 BOOL 并在你有 added/removed 时标记它。
编辑: 另外,我没有看到任何可以在代码中任何地方删除观察者的方法,请确保在您想停止观察时也将其删除。
示例:
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
或在您的 viewWillDissapear 方法中。
除了不应该多次设置观察者这一事实之外,我认为您应该在再次调用播放函数之前将播放器重置为零
func autoplayNextTrack(notefication: NSNotification) {
player.seekToTime(kCMTimeZero)
if (currentTrack + 1) >= urlPlayerItems.count {
currentTrack = 0
} else {
currentTrack += 1
}
playTrack()
}