2013-01-11 43 views
1

我在我的应用程序的表格视图中显示Spotify曲目的列表,并且想要下载这些曲目属于的相册的封面艺术。从Spotify下载封面艺术URL并进行键值观察

我登录到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变化:背景:被调用一次,与零的新旧价值,但在此之后,没事。但是,如果我按照SimplePlayer处理该字母(即,使用self.currentTrack而不是字典)并注册关键路径@“self.currentTrack.album.cover.spotifyURL”,则observerValue ...方法将被调用两次,一次与零和一次具有实际价值。

我错过了什么?哦,我注册了spotifyURL而不是图像,所以我可以缓存图像。这样,当用户退出应用程序并稍后返回时,并非所有图像都必须重新加载。

回答

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)]; 

]}; 
+2

'valueForKey'应该是'valueForKeyPath' – vaughan

+0

album.cover的数据类型是什么? –

+0

当我检索没有专辑封面的曲目时,出现错误。我怎么能抓住这个?错误是[NSNull isLoaded]。 –