2013-01-11 30 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]。 –