cocoalibspotify を使用する iPhone アプリを作成しています。ビューの 1 つで、プレイリストのすべての SPTrack をテーブル ビューに表示できるようにしたいと考えています。各セルには、アーティスト、アルバム、およびトラックの名前が表示されます。プレイリスト コンテンツを非同期的に取得するメソッドを実装しましたが、バックグラウンド スレッドで SPPlaylistItems を SPTrack オブジェクトに「変換」する適切な方法がわかりません。その結果、プレイリスト トラックを取得するたびに UI が遅れます。確かに、ラグは非常に小さいですが、それでも迷惑です. プレイリストのコンテンツを取得する私のメソッドは次のとおりです。
-(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); });
}
});
}
SPPlaylistItem から SPTrack を取得するには、SPSession の trackForURL メソッドを使用します。このメソッドのコールバックで、トラックを配列に追加します。ここで問題が発生します。これらのオブジェクトをメイン スレッドに追加すると、少し遅延が発生します。だから私の質問は:
- これは、SPPlaylist 内のすべての SPTrack オブジェクトを取得する適切な方法ですか? そうでない場合、UI がブロックされないようにバックグラウンド スレッドでこれを行う正しい方法は何ですか?
どんな助けでも大歓迎ですありがとう!