2017-02-03 11 views
3

Ich erstelle einen Sample Player für ein Testprojekt. Ich habe eine NSNotification erstellt, um eine Funktion zum Abspielen der nächsten Audiospur innerhalb eines Arrays aufzurufen. Das Problem ist, dass die Benachrichtigung diese Funktion etwa 8 Mal hintereinander aufruft? Ich habe keine Ahnung, warum das passiert. Hier ist mein Code und danke für die Hilfe!NSNotification wird mehr als einmal ausgelöst?

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

versuchen bewegen addObserver zu viewDidLoad Aufruf oder entfernen in viewWillDisappear –

+0

Ich habe das versucht und funktioniert immer noch nicht. Es wird immer noch mehrmals aufgerufen, wenn ich den Code von AutoplayNextTrack entfernen und nur eine Print-Anweisung gibt es einmal aufruft? – user7097242

+0

Auch wenn ich playTrack() -Clan in AutoplayNextTrack kommentiert es nicht mehr als einmal – user7097242

Antwort

3

Abgesehen von der Tatsache, dass ein Beobachter nicht mehrfach eingestellt werden soll, denke ich, dass Sie den Player auf Null zurückgesetzt rechts sollten, bevor Sie die Play-Funktion wieder

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

    playTrack() 
} 
+0

Eine vollständige Beispielcode mit den Vorschlägen wäre großartig ... Ich habe versucht alles über alles, was Sie gerade erwähnt haben und konnte es nicht herausfinden .. Danke – user7097242

+0

Ich habe gerade die Antwort aktualisiert. @ user7097242 – TheFuquan

+0

Ich habe die Zeile auf 0 zu suchen und es funktioniert jetzt Ich verstehe nicht, warum das Hinzufügen den Unterschied macht. Kannst du es mir bitte erklären, da ich komplett auf ein neues Video komplett verzichtet habe.Warum muss ich auf 0 suchen? – user7097242

0

Wenn Sie Ihre Beobachter in viewDidAppear Methode hinzufügen, müssen Sie sicher, dass Sie sie nur machen, fügen Sie ONCE. Die viewDidAppear-Methoden werden mehrmals aufgerufen.

Einfacher Weg ist nur ein BOOL zu machen und zu markieren, wenn Sie es hinzugefügt/entfernt haben.

EDIT: Auch sehe ich keine Methode, wo Sie den Beobachter irgendwo in Ihrem Code entfernen, stellen Sie sicher, dass Sie es auch entfernen, wenn Sie aufhören zu beobachten.

Beispiel:

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

oder in Ihrer viewWillDissapear Methode.

+0

Ich versuchte dies und immer noch nicht funktioniert. Es wird immer noch mehrmals aufgerufen, wenn ich den Code von AutoplayNextTrack entfernen und nur eine Print-Anweisung gibt es einmal aufruft? – user7097242

+0

Klingt wie dein Titel kann mir nicht abgespielt werden. –

+0

Überprüfen Sie meine aktualisierte Antwort. Ich bin mir nicht sicher, wie Sie Ihre gesamte Code-Konfiguration ausführen und wie Sie Ihre Player-Elemente aufrufen. "if urlPlayerItems.count> 0 {" usw. Vielleicht speichern Sie einen Verweis auf Ihr AVPlayerItem als Eigenschaft und fügen die Benachrichtigung dem tatsächlichen PlayerItem hinzu, anstatt die Benachrichtigung dem Player hinzuzufügen.currentItem hilft Ihnen, Ihr Problem zu lösen. Wenn Sie PlayerItems austauschen, müssen Sie sicherstellen, dass Sie die vorhandenen Benachrichtigungsobserver aus dem CURRENT-Player-Element entfernen, bevor Sie einem neuen Player Benachrichtigungen hinzufügen. –

Verwandte Themen