Загрузка обложки URL из Spotify и наблюдение значения ключа
Я показываю список треков Spotify в виде таблицы в моем приложении, и я хотел бы загрузить обложку для альбомов, к которым принадлежат эти треки.
Я вошел в CocoaLibSpotify и могу проигрывать все треки, так что с этой частью все в порядке. То, что я не могу заставить работать - это скачать обложку. Я следую коду проекта SimplePlayer, за исключением того, что я храню экземпляры SPTrack в изменяемом словаре (trackDownladingForCoverArt), так как может быть много дорожек, загружающих обложки.
Итак, вот что я делаю:
[[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
}
}];
}
}];
Наблюдение ValueForKeyPath:ofObject:change:context: вызывается один раз, со старым и новым значением nil, но после этого ничего. Однако, если я следую за SimplePlayer к букве (т. Е. Получаю self.currentTrack вместо словаря) и регистрируюсь для ключевого пути @"self.currentTrack.album.cover.spotifyURL", метод наблюдатель Value... вызывается дважды, один раз с нулем и один раз с фактическим значением.
Что мне не хватает? О, и я регистрируюсь для spotifyURL, а не для изображения, чтобы я мог кэшировать изображение. Таким образом, когда пользователь выходит из приложения и возвращается позже, не все изображения необходимо перезагружать.
1 ответ
Это предполагаемое поведение - обложка не загружается, если вы явно не попросите ее ограничить использование данных. Чтобы загрузить все обложки, вы можете сделать это...
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
имущество. Чтобы заставить все крышки начать загрузку, вам нужно вызвать -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)];
]};