1

アプリケーションのテーブル ビューに Spotify トラックのリストを表示しています。これらのトラックが属するアルバムのカバー アートをダウンロードしたいと考えています。

私は CocoaLibSpotify にログインしており、すべてのトラックを再生できるので、その部分は問題ありません。仕事に取り組めないように見えるのは、カバーアートのダウンロードです。カバー アートをダウンロードするトラックが多数ある可能性があるため、変更可能なディクショナリ (tracksDownladingForCoverArt) に SPTrack インスタンスを格納することを除いて、SimplePlayer プロジェクトのコードに従います。

だから、これは私がすることです:

[[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 で 1 回呼び出されますが、その後は何も呼び出されません。ただし、SimplePlayer を文字に従って (つまり、辞書の代わりに self.currentTrack を使用して) キー パス @"self.currentTrack.album.cover.spotifyURL" に登録すると、observerValue... メソッドが 2 回、1 回呼び出されます。 nil で 1 回、実際の値で 1 回。

私は何が欠けていますか?ああ、画像ではなく、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));
    }];
]};

カバーはかなり大きくなる可能性があるため、多数のカバーをロードする場合は、より大きなタイムアウトが必要になる可能性があります。

カバーに使用したくない場合の別の方法は、各トラックのプロパティで KVOSPAsyncLoadingを使用してトラックをロードすることです。すべてのカバーの読み込みを強制的に開始するには、各カバーのメソッドを呼び出す必要があります。例えば:SPAsyncLoadingalbum.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 に答える