Spotify iOS SDK Swift显示所有(!)播放列表(20+) [英] Spotify iOS SDK Swift display all (!) playlists (20+)

查看:227
本文介绍了Spotify iOS SDK Swift显示所有(!)播放列表(20+)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我能够在Swift中轻松获得前20个播放列表.

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

func getPlaylists() {
    //DispatchQueue.global(qos: .userInitiated).async {

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

        Alamofire.request(playListRequest)
            .response { response in


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

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


                        let currentPlaylist: PlaylistItem = PlaylistItem(playlistName: playlist.name, playlistURL: playlist.uri.absoluteString)
                        self.playlists.append(currentPlaylist)
                    }
                }
                self.tableView.reloadData()
        }

到目前为止-很好.但这(根据文档,只提供前20个播放列表.

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

重构C代码失败

提前谢谢!

推荐答案

您不能使用while循环来完成此操作,因为网络调用是异步的.您可以递归地请求下一页,并在完成处理程序中每次页面返回时重新加载表.

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.

假设您具有以下属性

var playlists = [SPTPartialPlaylist]()

在您的getPlaylists函数中,您可能会遇到类似的事情(使用Alamofire的方式也可以正常工作):

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
                self.activityIndicator.stopAnimating()
                if let listPage = response as? SPTPlaylistList, let playlists = listPage.items as? [SPTPartialPlaylist] {
                    self.playlists = playlists    // or however you want to parse these
                    self.tableView.reloadData()
                    if listPage.hasNextPage {
                        self.getNextPlaylistPage(currentPage: listPage)
                    }
                }
            })

getNextPlaylistPage如下所示:

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
            self.tableView.reloadData()
            if page.hasNextPage {
                self.getNextPlaylistPage(currentPage: page)
            }
        }
    })
}

如果您想进一步解决问题中的方法,可以结合使用Alamofire和SPTListPagecreateRequestForNextPageWithAccessToken函数来构建getNextPlaylistPage.

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.

(请注意,SPTPlaylistListSPTListPage的子类.)

(Note that SPTPlaylistList is a subclass of SPTListPage.)

距离我更新SpotifyMetadata框架已经有几个月了,所以上面的某些内容可能已经稍作更改了...但是总体概念仍然相同.

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.

这篇关于Spotify iOS SDK Swift显示所有(!)播放列表(20+)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆