我在应用程序的表格视图中显示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而不是图像,所以我可以缓存图像。这样,当用户退出应用程序并稍后返回时,并非所有图像都必须重新加载。
答案 0 :(得分:2)
这是预期的行为 - 除非您明确要求保留数据使用率,否则不会加载封面。要加载所有封面图片,你可以这样做......
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)];
]};