从Spotify下载封面艺术URL和关键值

从Spotify下载封面艺术URL和关键值,spotify,cocoalibspotify-2.0,Spotify,Cocoalibspotify 2.0,我在应用程序的表视图中显示了Spotify曲目列表,我想下载这些曲目所属专辑的封面艺术 我已经登录到CocoaLibSpotify,我可以播放所有曲目,所以这部分很好。我似乎无法开始工作的是封面艺术的下载。我遵循SimplePlayer项目的代码,唯一的例外是我将SPTrack实例存储在可变字典(tracksDownladingForCoverArt)中,因为可能有许多曲目下载封面艺术 所以,我就是这么做的: [[SPSession sharedSession] trackForURL:nati

我在应用程序的表视图中显示了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而不是图像,这样我可以缓存图像。这样,当用户退出应用程序并稍后返回时,并不需要重新加载所有图像。

这是预期行为-封面艺术不会加载,除非您明确要求它降低数据使用率。要加载所有封面艺术,您可以这样做

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
属性上加载曲目。要强制所有封套开始加载,需要调用每个封套的
-starting
方法。例如:

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
唱片集.封面的数据类型是什么?检索没有唱片集封面的曲目时出错。我怎么能抓住这个?错误为[NSNull isLoaded]。在将NSNull的所有实例发送到SPAsynLoading之前,您需要从coverArts数组中删除它们。或者,是否可以使用cocoalibspotify获取相册封面的url?