Ios 在Cocoalibspotify中检索播放列表的所有SpTrack的正确方法是什么?
我正在编写一个iPhone应用程序,它使用cocoalibspotify。在我的一个视图中,我希望能够在表视图中显示播放列表的所有曲目。每个单元格应显示艺术家、唱片集和曲目名称。我已经实现了一种异步检索播放列表内容的方法,但是我还没有找到在后台线程上将SPPlaylistItems“转换”为SPTrack对象的正确方法。因此,每次检索播放列表曲目时,我的UI都会滞后。诚然,延迟很小,但仍然令人讨厌。下面是我检索播放列表内容的方法Ios 在Cocoalibspotify中检索播放列表的所有SpTrack的正确方法是什么?,ios,cocoalibspotify-2.0,Ios,Cocoalibspotify 2.0,我正在编写一个iPhone应用程序,它使用cocoalibspotify。在我的一个视图中,我希望能够在表视图中显示播放列表的所有曲目。每个单元格应显示艺术家、唱片集和曲目名称。我已经实现了一种异步检索播放列表内容的方法,但是我还没有找到在后台线程上将SPPlaylistItems“转换”为SPTrack对象的正确方法。因此,每次检索播放列表曲目时,我的UI都会滞后。诚然,延迟很小,但仍然令人讨厌。下面是我检索播放列表内容的方法 -(void)getPlaylistContentAsynchro
-(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); });
}
});
}
-(void)GetPlayContentAsynchronousLyofPlayList:(NSString*)播放名回调:(void(^)(NSArray*播放曲目))块{
NSLog(@“同步获取内容…”);
NSMUTABLEARRY*MUTABLEARRY=[[NSMUTABLEARRY alloc]init];
SPPlaylist*playlist=[self-GetPlayliWithName:PlayliName];
__block BOOL addedAllTracks=mutableArray.count==playlist.items.count;
用于(SPPlaylistItem*播放列表中的项目。项目){
NSLog(@“----使用url%@”检查跟踪,item.itemURL.absoluteString);
NSURL*trackURL=[item.item spotifyURL];
[[SPSSession sharedSession]trackForURL:trackURL回调:^(SPTrack*spotifyTrack){
如果(spotifyTrack){
//NSLog(@“--->>>添加带有url%@”、item.itemURL.absoluteString的曲目);
[mutableArray addObject:spotifyTrack];
}
if(mutableArray.count==playlist.items.count){
//NSLog(@“!!!!!!!!!添加了所有歌曲!”);
addedAllTracks=是;
}
}];
}
调度异步(self.backgroundQueue^{
NSLog(@“异步检索播放列表内容…”);
而(!addedAllTracks){
NSLog(@“BG队列正在等待…”);
[NSThread sleepForTimeInterval:0.25];
}
如果(块){
NSLog(@“已完成异步检索播放列表内容”);
NSLog(@“*******将%d个曲目传递给调用者”,mutableArray.count);
dispatch_async(dispatch_get_main_queue(),^(){block(mutableArray);});
}
});
}
要从SPPlaylistItem检索SPTrack,我使用SPSession的trackForURL方法。在这个方法的回调中,我将轨迹添加到数组中。这就是问题所在:在主线程中添加这些对象会导致一些延迟。所以我的问题是:
感谢您的帮助,谢谢 通过URL创建新曲目的效率极低,
SPPlaylistItem
包含曲目本身
将通过URL获取曲目的部分替换为类似的内容,您应该可以:
for (SPPlaylistItem *item in playlist.items) {
if (item.itemClass == [SPTrack class])
[mutableArray addObject:item.item];
}
另外,值得注意的是,一次从播放列表中获取所有曲目是一个相当糟糕的主意——播放列表变得非常大,当你一次在屏幕上只有20首左右的曲目时,保留10000首曲目会让你很快耗尽内存