2017-02-03 59 views
3

我正在爲測試項目創建一個示例播放器。我創建了一個NSNotification來調用一個函數來播放數組中的下一個音軌。問題是通知連續調用這個函數8次?我不知道爲什麼會發生這種情況。這是我的代碼,並感謝您的幫助!NSNotification被更多次發射?

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

嘗試移動的addObserver到viewDidLoad中或將其刪除之前在viewWillDisappear –

+0

我試過這個,但仍然無法正常工作。它仍然被調用多次,雖然當我從autoplayNextTrack中刪除代碼,只是把一個打印語句調用它一次? – user7097242

+0

另外,當我評論playTrack()在autoplayNextTrack部門它不會多稱呼它一次 – user7097242

回答

3

除了一個事實,即觀察者不應設置多次,我認爲你應該將播放器復位至零右調用播放功能再次

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

    playTrack() 
} 
+0

完整的代碼示例建議將是偉大的...我嘗試了一切,包括你剛纔提到的,無法弄清楚。謝謝 – user7097242

+0

我剛剛更新了答案。@ user7097242 – TheFuquan

+0

我添加了該行以尋求0,它現在可以工作了。我不明白爲什麼加入這些改變會有所不同?你可以解釋一下,因爲我完全是在一起跳到一個新的視頻。爲什麼我需要尋求0? – user7097242

0

如果您在viewDidAppear方法中添加你的觀察,你需要確保你只添加它們ONCE。 viewDidAppear方法將被多次調用。

簡單的方法是創建一個BOOL並在添加/刪除它時將其標記。

編輯: 此外,我沒有看到任何方法,您可以在代碼中的任何位置刪除觀察者,並確保在您要停止觀察時將其刪除。

實施例:

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

或在viewWillDissapear方法。

+0

我試過這個,但仍然無法正常工作。它仍然被調用多次,雖然當我從autoplayNextTrack中刪除代碼,只是把一個打印語句調用它一次? – user7097242

+0

您的曲目的聲音無法播放給我。 –

+0

檢查我的更新答案。我不確定您是如何運行整個代碼設置以及如何調用您的播放器項目。 「如果urlPlayerItems.count> 0 {」等等。也許可以將對AVPlayerItem的引用存儲爲屬性,然後將通知添加到實際的playerItem中,而不是將通知添加到player.currentItem可幫助您解決問題。當您交換playerItems時,您需要確保在將通知添加到新playerItem之前,從CURRENT playeritem中刪除現有通知服務器 – 2017-02-03 19:33:56