我已经为此挣扎了一段时间,并四处寻找在iOS(确切地说是iOS 7)上使用过CocoaLibSpotify的人的一些建议。
我正在尝试加载SPPlaylist中的所有(SPTrack)项目。我已经查看了示例代码和文档,所以我知道观察事物的最佳方式是使用KVO,但我看不出这是最好的方式。
看看GitHub和网络上的"Guess the Into"示例和其他来源,我正在做的程序如下:
- 获取SPPlaylist(这要么直接来自用户播放列表,要么从保存的URL创建)
- 使用SPAsyncLoading加载播放列表
- 循环通过SPPlaylist中返回的SPPlaylistItems并获得所有SPTrack对象
- 将SPTrack对象的数组传递到另一个SPAsyncLoading调用中
- 显示
loadedItems
阵列中的所有项目
步骤5似乎是出现问题的地方。有时还好,我会显示播放列表中的所有曲目。然而,大多数时候它不会加载它们,或者只加载少数(通常很少)。
我注意到,重新启动手机有时会让它正常工作。尽管在运行应用程序(或更改播放列表)几次后,它再次停止工作。
当我记录每一步时,我会得到以下内容:
-[ViewController sessionDidLoginSuccessfully:]
Load playlist with URL: spotify:user:XXXXX:playlist:XXXXXXXXXXXXXXXXXXXXXX
Created playlist: <SPPlaylist: 0x16775bc0>: (null) (0 items)
Loaded playlist: <SPPlaylist: 0x16775bc0>: Playlist Name (59 items)
Created SPTrack items: 59
Loaded SPTrack items: 1
Failed to load SPTrack items: 58
正如您所看到的,用户已登录,并具有有效的会话。每一步都按计划进行,直到最后。有时,即使它加载了一首曲目,它也不允许我播放它,也不允许返回SP_TRACK_AVAILABILITY_UNAVAILABLE
。
如果有帮助的话,我还在下面添加了一个代码片段。但在这一点上,任何帮助都将不胜感激。
谢谢。
- (void)loadPlaylist
{
__weak NSURL *spotifyURL = <URL from saved SPPlaylist>;
NSLog(@"Load playlist with URL: %@", spotifyURL);
[SPPlaylist playlistWithPlaylistURL:spotifyURL inSession:[SPSession sharedSession] callback:^(SPPlaylist *playlist) {
_spotifyPlaylist = playlist;
NSLog(@"Created playlist: %@", _spotifyPlaylist);
[SPAsyncLoading waitUntilLoaded: _spotifyPlaylist timeout:kSpotifyTimeout then:^(NSArray *loadedItems, NSArray *notLoadedItems) {
NSLog(@"Loaded playlist: %@", _spotifyPlaylist);
if ([loadedItems count] > 0)
[self loadSpotifyPlaylist];
}];
}];
}
- (void)loadSpotifyPlaylist
{
NSArray *tracksArray = [self tracksFromPlaylistItems:[_spotifyPlaylist items]];
NSLog(@"Created SPTrack items: %d", [tracksArray count]);
if (tracksArray && [tracksArray count] > 0)
{
[SPAsyncLoading waitUntilLoaded:tracksArray timeout:kSpotifyTimeout then:^(NSArray *loadedItems, NSArray *notLoadedItems) {
_playlist = loadedItems;
NSLog(@"Loaded SPTrack items: %d", [loadedItems count]);
NSLog(@"Failed to load SPTrack items: %d", [notLoadedItems count]);
[self finishReloadData];
}];
}
_spotifyPlaylist
和_playlist
都是strong
实例,而tracksFromPlaylistItems:
与"猜测信息"示例代码中使用的方法相同。
编辑:kSpotifyTimeout
超时设置为10.0
。
kSpotifyTimeout
的价值是什么?我认为你看到的只是元数据可能需要很长时间才能加载(尤其是昨天Spotify后端似乎出现了问题,这种情况可能会不时发生)。
一般来说,一次加载播放列表的全部内容是不好的做法,你会发现Guess the Intro实际上并不关心是否加载了所有曲目——它只是抓取加载时发生的事情,并将这些曲目用于游戏。
一个好的方法是对播放列表曲目的加载进行分页,以匹配您的UI。也就是说,只加载用户可以看到的曲目,再加上一两个"屏幕"。当用户滚动时,您可以开始加载曲目-UIScrollViewDelegate
的-scrollViewWillEndDragging:withVelocity:targetContentOffset:
对此特别好,因为它可以让您看到用户将在哪里"着陆"并开始加载该点的曲目。有一些示例代码可以做到这一点,还有一个名为SPSparseArray
的助手类,用于在CococaLibSpotify的dev
分支上部分加载播放列表等内容(尽管要注意dev
分支=测试版质量)。