Я пишу приложение для iPhone, которое использует cocoalibspotify. В одном из моих представлений я хочу иметь возможность отображать все SPTracks плейлиста в виде таблицы. Каждая ячейка должна отображать Исполнитель, Альбом и Название трека. Я реализовал метод, который извлекает контент плейлиста асинхронно, но я не нашел правильного способа выполнить «преобразование» элементов SPPlaylistItems в объекты SPTrack в фоновом потоке. В результате мой пользовательский интерфейс ложится каждый раз, когда я извлекаю треки списка воспроизведения. Конечно, отставание очень незначительное, но это все еще раздражает. Вот мой метод, который извлекает содержимое списка воспроизведения.Каков правильный способ получить все SPTracks плейлиста в Cocoalibspotify?
-(void)getPlaylistContentAsynchronouslyOfPlaylist:(NSString *)playlistName callback:(void (^)(NSArray *playlistTracks))block{
NSLog(@"Getting content ansynchronously...");
NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
SPPlaylist *playlist = [self getPlaylistWithName:playlistName];
__block BOOL addedAllTracks = mutableArray.count == playlist.items.count;
for (SPPlaylistItem *item in playlist.items){
NSLog(@"----Checking Track with url %@", item.itemURL.absoluteString);
NSURL *trackURL = [item.item spotifyURL];
[[SPSession sharedSession]trackForURL:trackURL callback:^(SPTrack * spotifyTrack){
if(spotifyTrack){
//NSLog(@"---->>>Adding Track with url %@", item.itemURL.absoluteString);
[mutableArray addObject:spotifyTrack];
}
if (mutableArray.count == playlist.items.count){
//NSLog(@"!!!!!!!Added all songs!");
addedAllTracks = YES;
}
}];
}
dispatch_async(self.backgroundQueue, ^{
NSLog(@"Retrieving playlist content asynchronously...");
while (!addedAllTracks){
NSLog(@"<><><><>BG Queue is waiting....");
[NSThread sleepForTimeInterval:0.25];
}
if (block){
NSLog(@"Done retrieving playlist content asynchronously");
NSLog(@"*******Passing %d tracks to the caller", mutableArray.count);
dispatch_async(dispatch_get_main_queue(), ^() { block(mutableArray); });
}
});
}
Чтобы получить SPTrack из SPPlaylistItem я использую метод trackForURL в SPSession в. В обратном вызове этого метода я добавляю трек в массив. Вот в чем проблема: добавление этих объектов в основной поток приводит к небольшому отставанию. Так что я задал себе вопрос:
- Это правильный способ получить все объекты SPTrack внутри SPPlaylist? Если нет, то каков правильный способ сделать это в фоновом потоке, чтобы мой пользовательский интерфейс не был заблокирован?
Любая помощь с благодарностью!
Я попробую, спасибо! – cbbcloud
Это прекрасно работает, спасибо. – cbbcloud