从 Spotify 下载封面艺术 URL 和键值观察
Posted
技术标签:
【中文标题】从 Spotify 下载封面艺术 URL 和键值观察【英文标题】:Downloading cover art URL from Spotify and key-value observing 【发布时间】:2012-12-26 13:53:15 【问题描述】:我在我的应用程序的表格视图中显示 Spotify 曲目列表,我想下载这些曲目所属专辑的封面。
我已登录 CocoaLibSpotify,我可以播放所有曲目,所以这部分没问题。我似乎无法开始工作的是封面艺术的下载。我遵循 SimplePlayer 项目的代码,但我将 SPTrack 实例存储在可变字典 (tracksDownladingForCoverArt) 中,因为可能有很多轨道下载封面。
所以,我就是这样做的:
[[SPSession sharedSession] trackForURL:nativeSpotifyURL callback:^(SPTrack *track)
if (track != nil)
[track addObserver:self forKeyPath:@"album.cover.spotifyURL" options:0 context:NULL];
self.tracksDownloadingForCoverArt[nativeSpotifyURL] = track;
[SPAsyncLoading waitUntilLoaded:track timeout:kSPAsyncLoadingDefaultTimeout then:^(NSArray *tracks, NSArray *notLoadedTracks)
if ([tracks count] > 0)
// I don't believe I need to do anything here
];
];
observeValueForKeyPath:ofObject:change:context: 被调用一次,新旧值都为 nil,但在那之后,什么都没有。但是,如果我遵循 SimplePlayer 的字母(即使用 self.currentTrack 而不是字典)并注册键路径 @"self.currentTrack.album.cover.spotifyURL",observerValue... 方法被调用两次,一次有 nil 和一次有实际值。
我错过了什么?哦,我注册的是 spotifyURL 而不是图像,所以我可以缓存图像。这样,当用户退出应用并稍后返回时,不必重新加载所有图像。
【问题讨论】:
【参考方案1】:这是预期的行为——除非您明确要求降低数据使用量,否则不会加载封面。要加载所有封面,您可以这样做……
NSArray *tracksToGetArtFor = …; // Get some tracks;
[SPAsyncLoading waitUntilLoaded:tracks timeout:kSPAsyncLoadingDefaultTimeout then:^(NSArray *loadedTracks, NSArray *notLoadedTracks)
NSArray *coverArts = [tracks valueForKey:@"album.cover"]; // Get an array of the track's covers
[SPAsyncLoading waitUntilLoaded:coverArts timeout:kSPAsyncLoadingDefaultTimeout then:^(NSArray *loadedCovers, NSArray *notLoadedCovers)
NSLog(@"Number of covers that're loaded: %@:", @(loadedCovers.count));
];
];
您可能需要更长的超时时间来加载大量封面,因为它们可能相当大。
如果您不想为封面使用SPAsyncLoading
,另一种方法是使用SPAsyncLoading
加载轨道,然后在每个轨道的album.cover
属性上使用KVO。要强制所有封面开始加载,您需要调用每个封面的-startLoading
方法。例如:
NSArray *tracksToGetArtFor = …; // Get some tracks;
[SPAsyncLoading waitUntilLoaded:tracks timeout:kSPAsyncLoadingDefaultTimeout then:^(NSArray *loadedTracks, NSArray *notLoadedTracks)
NSArray *coverArts = [tracks valueForKey:@"album.cover"]; // Get an array of the track's covers
// Trigger the -startLoading method of each cover.
[coverArts makeObjectsPerformSelector:@selector(startLoading)];
];
【讨论】:
valueForKey
应该是valueForKeyPath
album.cover 的数据类型是什么?
检索没有专辑封面的曲目时出现错误。我怎么能抓住这个?错误是 [NSNull isLoaded]。
在将它们发送到 SPAsynLoading 之前,您需要从您的 coverArts 数组中删除所有 NSNull 实例。
或者是否可以使用 cocoalibspotify 获取专辑封面的 url?以上是关于从 Spotify 下载封面艺术 URL 和键值观察的主要内容,如果未能解决你的问题,请参考以下文章
libspotify API:如何使用 libspotify API 检索封面艺术?