Spotify iOS SDK Swift display all (!) playlists (20+)

Posted on

Spotify iOS SDK Swift display all (!) playlists (20+)

I’m able to get the first 20 playlists fairly easily in Swift.

func getPlaylists() {
    // .userInitiated).async {

        let playListRequest = try! SPTPlaylistList.createRequestForGettingPlaylists(forUser: session.canonicalUsername, withAccessToken: session.accessToken)

            .response { response in

                let list = try! SPTPlaylistList(from:, with: response.response)

                for playList in list.items  {
                    if let playlist = playList as? SPTPartialPlaylist {

                        let currentPlaylist: PlaylistItem = PlaylistItem(playlistName:, playlistURL: playlist.uri.absoluteString)

So far – so good. But this (as per documentation only delivers the first 20 playlists.

How can I get more (all!) playlists by adding a loop that is nested by something like

 while list.hasNextPage == true {

Refactoring the C-code was not successful

Thanks in advance!

Solution :

You can’t do it using a while loop, because the network calls are asynchronous. You can recursively request for the next page instead, and reload the table every time a page returns in the completion handler.

Assuming you have the following property

var playlists = [SPTPartialPlaylist]()

In your getPlaylists function, you could have something like this (the way you have it using Alamofire also works fine):

            SPTPlaylistList.playlists(forUser: session.canonicalUsername, withAccessToken: session.accessToken, callback: { (error, response) in
                if let listPage = response as? SPTPlaylistList, let playlists = listPage.items as? [SPTPartialPlaylist] {
                    self.playlists = playlists    // or however you want to parse these
                    if listPage.hasNextPage {
                        self.getNextPlaylistPage(currentPage: listPage)

Where getNextPlaylistPage looks something like this:

func getNextPlaylistPage(currentPage: SPTListPage) {
    currentPage.requestNextPage(withAccessToken: AppDelegate.shared().auth?.session.accessToken, callback: { (error, response) in
        if let page = response as? SPTListPage, let playlists = page.items as? [SPTPartialPlaylist] {
            self.playlists.append(contentsOf: playlists)     // or parse these beforehand, if you need/want to
            if page.hasNextPage {
                self.getNextPlaylistPage(currentPage: page)

If you wanted to do this more in keeping with the method you have in your question, you could build getNextPlaylistPage using a combination of Alamofire and SPTListPage‘s createRequestForNextPageWithAccessToken function.

(Note that SPTPlaylistList is a subclass of SPTListPage.)

It’s also been a few months since I updated my SpotifyMetadata framework, so some of the above may have changed slightly…but the general concept remains the same.

Leave a Reply

Your email address will not be published. Required fields are marked *