aaronium112
aaronium112

Reputation: 3088

How to pass a Notification to the method called by the Observer in Swift 3

I would like to access the Notification object that is sent from the method below.

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

The Notifications name is defined as:

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

Here is the observer:

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

Here is the Method it calls:

func testSelector(notification:Notification){

    queueNextTrack()

}

How do I pass testSelector a notification object? I know it has something to do with the object parameter of the addObserver method.

Thank you.

Upvotes: 1

Views: 1383

Answers (1)

jjatie
jjatie

Reputation: 5332

You can now get rid of your problem entirely by not using selectors in your notifications, timers, etc. There are new block based API to replace target-selector such as

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

For the most part you won't need access to the notifications in your blocks so you could do this too

func testSelector(){
    queueNextTrack()
}

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

or most my preferred in most scenarios:

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

EDIT I'd also suggest you take a look at the sample code in the description for this API

Upvotes: 1

Related Questions