Spotify iOS SDK Swift 显示所有(!)播放列表(20+)
Spotify iOS SDK Swift display all (!) playlists (20+)
我能够在 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 循环执行此操作,因为网络调用是异步的。您可以改为递归请求下一页,并在完成处理程序中每次 returns 页面时重新加载 table。
假设您有以下 属性
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
的 createRequestForNextPageWithAccessToken
函数来构建 getNextPlaylistPage
.
(注意 SPTPlaylistList
是 SPTListPage
的子类。)
自从我更新我的 SpotifyMetadata 框架以来也有几个月了,所以上面的一些内容可能略有变化......但总体概念保持不变。
我能够在 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 循环执行此操作,因为网络调用是异步的。您可以改为递归请求下一页,并在完成处理程序中每次 returns 页面时重新加载 table。
假设您有以下 属性
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
的 createRequestForNextPageWithAccessToken
函数来构建 getNextPlaylistPage
.
(注意 SPTPlaylistList
是 SPTListPage
的子类。)
自从我更新我的 SpotifyMetadata 框架以来也有几个月了,所以上面的一些内容可能略有变化......但总体概念保持不变。