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()
}