ios - Spotify iOS SDK Swift 显示所有(!)播放列表(20+)

标签 ios swift sdk spotify

我可以在 Swift 中相当轻松地获取前 20 个播放列表。

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 个播放列表。

如何通过添加由类似内容嵌套的循环来获得更多(全部!)播放列表

 while list.hasNextPage == true {
}

重构 C 代码未成功

提前致谢!

最佳答案

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

假设您有以下属性(property)

var playlists = [SPTPartialPlaylist]()

在您的 getPlaylists 函数中,您可以有类似这样的内容(使用 Alamofire 的方式也可以正常工作):

            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 和 SPTListPage 来构建 getNextPlaylistPage >createRequestForNextPageWithAccessToken 函数。

(请注意,SPTPlaylistListSPTListPage 的子类。)

自从我更新 SpotifyMetadata 框架以来也已经过去了几个月,所以上面的一些内容可能略有变化......但总体概念保持不变。

关于ios - Spotify iOS SDK Swift 显示所有(!)播放列表(20+),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44182997/

相关文章:

ios - Xcode 无法识别已经定义的 Sprite ?

ios - 将 NSNumber 转换为 Float 时出现意外行为

ios - 如何区分两个本地通知

ios - 将核心数据迁移到一个干净的开始

iphone - iOS Link Binary with library 仅用于调试

swift - 为什么在此示例中使用强制展开?

ios - UIPercentDrivenInteractiveTransition 取消问题

android - Sony Xperia Smartwatch MN2 如何在上面安装 Apk 文件?

java - '警告 BG8102 : Class X has unknown base type Y' warning while binding java code in xamarin

iphone - Facebook Feed 对话框不断请求许可