NSNotification被解雇多次?

时间:2017-02-03 19:15:32

标签: ios iphone swift nsnotificationcenter observers

我正在为测试项目创建一个示例播放器。我创建了一个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()
    }

2 个答案:

答案 0 :(得分:5)

除了观察者不应多次设置之外,我认为你应该在再次调用播放功能之前将播放器重置为零

func autoplayNextTrack(notefication: NSNotification) {
    player.seekToTime(kCMTimeZero)
    if (currentTrack + 1) >= urlPlayerItems.count {
        currentTrack = 0
    } else {
        currentTrack += 1
    }

    playTrack()
}

答案 1 :(得分:0)

如果您在viewDidAppear方法中添加观察者,则需要确保只添加 ONCE 。 viewDidAppear方法将被多次调用。

简单的方法就是制作BOOL并在添加/删除它时标记它。

编辑: 此外,我没有看到任何方法,您在代码中的任何位置删除观察者,请确保在您想要停止观察时也将其删除。

示例:

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

或在viewWillDissapear方法中。