2013-04-24 3 views
0

Я пишу приложение для 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 в. В обратном вызове этого метода я добавляю трек в массив. Вот в чем проблема: добавление этих объектов в основной поток приводит к небольшому отставанию. Так что я задал себе вопрос:

  1. Это правильный способ получить все объекты SPTrack внутри SPPlaylist? Если нет, то каков правильный способ сделать это в фоновом потоке, чтобы мой пользовательский интерфейс не был заблокирован?

Любая помощь с благодарностью!

ответ

0

Создание нового трека по URL-адресу невероятно неэффективно: в SPPlaylistItem содержится трек.

Заменить часть, где вы получите трек URL с чем-то вроде этого, и вы должны быть хорошо:

for (SPPlaylistItem *item in playlist.items) { 
    if (item.itemClass == [SPTrack class]) 
     [mutableArray addObject:item.item]; 
} 

Кроме того, стоит отметить, что извлечение всех дорожек из списка воспроизведения сразу довольно плохая идея - плейлисты получают очень большой и удерживая 10 000 треков, когда у вас только 20 или около того на экране сразу, это заставит вас быстро разрядиться.

+0

Я попробую, спасибо! – cbbcloud

+0

Это прекрасно работает, спасибо. – cbbcloud

Смежные вопросы