我一直在努力解决这个问题,并且正在寻找任何在iOS上使用CocoaLibSpotify的人的建议(确切地说是iOS 7)。
我正在尝试加载SPPlaylist中的所有(SPTrack)项目。我看过示例代码和文档,所以我知道观察事物的最佳方式是使用KVO,但是我无法看到这是最好的方式。
查看GitHub和网络上的“猜猜入”示例和其他来源,我正在做的事情如下:
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
。
答案 0 :(得分:0)
你kSpotifyTimeout
的价值是多少?我认为你所看到的仅仅是元数据需要花费很长时间才能加载的事实(特别是昨天Spotify后端似乎遇到麻烦,这可能会不时发生)。
通常,一次加载播放列表的全部内容是不好的做法,你会看到Guess the Intro实际上并不关心是否加载了所有曲目 - 它只是抓住加载的内容并使用它们游戏的轨道。
一个好的方法是分页加载播放列表曲目以匹配您的UI。也就是说,只加载用户可以看到的曲目,加上可能是“屏幕”或两个值得上下的曲目。当用户滚动时,您可以开始加载曲目 - UIScrollViewDelegate
s -scrollViewWillEndDragging:withVelocity:targetContentOffset:
对此特别有用,因为它可以让您看到用户将“登陆”并开始为该点加载曲目。有一些示例代码用于执行此操作以及一个名为SPSparseArray
的帮助程序类,用于在CococaLibSpotify的dev
分支上部分加载播放列表等内容(尽管请注意dev
branch = beta quality)