我可以在 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
(请注意,SPTPlaylistList
是 SPTListPage
的子类。)
自从我更新 SpotifyMetadata 框架以来也已经过去了几个月,所以上面的一些内容可能略有变化......但总体概念保持不变。
关于ios - Spotify iOS SDK Swift 显示所有(!)播放列表(20+),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44182997/