2016-08-08 19 views
1

aufgerufene Methode übergibt Ich möchte auf das Benachrichtigungsobjekt zugreifen, das von der folgenden Methode gesendet wird.Wie man eine Benachrichtigung an die vom Observer in Swift 3

var currentTrack:MPMediaItem? { 
    get{ 
     return playlist?.items[index] 
    } 
    set{ 
     print(newValue?.title!) 
     //self.index = locateIndex(track: newValue!) 
     let notif = Notification.init(name: Playlist.SongChangedName, object:self) 
     NotificationCenter.default.post(notif) 
    } 
} 

Der Name Benachrichtigungen ist definiert als:

override init() { 
    super.init() 
    NotificationCenter.default.addObserver(self, 
              selector: #selector(testSelector), 
              name: Playlist.SongChangedName, //Notification.Name("songChanged"), 
              object: nil) 
} 

Hier ist die Methode, es nennt:

func testSelector(notification:Notification){ 

    queueNextTrack() 

} 

Wie kann ich

static let SongChangedName = Notification.Name("SongChangedNotification") 

Hier ist der Beobachter testSelector ein Benachrichtigungsobjekt übergeben? Ich weiß, dass es etwas mit dem Objektparameter der addObserver-Methode zu tun hat.

Vielen Dank.

+0

Es ist in der Meldung, die auf Ihre Wähler in 'notification.object' – dan

+0

rechts übergeben wird. Wie übermittle ich diese Benachrichtigung an den Selektor? Wo ist der Verweis auf die Benachrichtigung in der addObserver-Methode? – Aaronium112

+0

Es ist bereits in Ihrem Selektor übergeben, Sie müssen nichts anderes tun, als die "addObserver" -Methode – dan

Antwort

0

Sie nun nicht mit Selektoren in Ihre Benachrichtigungen, Timer völlig Ihr Problem loszuwerden, etc. Es gibt neue Block-basierte API Ziel-Selektor wie

NotificationCenter.default.addObserver(forName: Playlist.SongChangedName, object: nil, queue: nil, using: { notification in 
    self.testSelector(testSelector) 
}) 

Zum größten Teil Sie ersetzen keinen Zugriff auf die Mitteilungen in Ihren Blöcken benötigen, so dass Sie dies meine bevorzugte tun könnten

func testSelector(){ 
    queueNextTrack() 
} 

NotificationCenter.default.addObserver(forName: Playlist.SongChangedName, object: nil, queue: nil) { _ in 
    self.testSelector() 
} 

oder die meisten in den meisten Szenarien:

override init() { 
    super.init() 
    let testBlock: (Notification) -> Void = { 
     self.queueNextTrack() 
    } 
    NotificationCenter.default.addObserver(forName: Playlist.SongChangedName, object: nil, queue: nil, using: testBlock) 
} 

EDIT ich auch würde vorschlagen, dass Sie an dem Beispielcode in der Beschreibung für diese API einen Blick