1

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

4

1 回答 1

2

这是预期的行为——除非您明确要求它降低数据使用量,否则不会加载封面艺术。要加载所有封面,您可以这样做……</p>

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使用SPAsyncLoadingKVO加载轨道。album.cover要强制所有封面开始加载,您需要调用-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)];

]};
于 2013-01-12T14:17:45.090 回答