Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Cocoalibspotify中检索播放列表的所有SpTrack的正确方法是什么?_Ios_Cocoalibspotify 2.0 - Fatal编程技术网

Ios 在Cocoalibspotify中检索播放列表的所有SpTrack的正确方法是什么?

Ios 在Cocoalibspotify中检索播放列表的所有SpTrack的正确方法是什么?,ios,cocoalibspotify-2.0,Ios,Cocoalibspotify 2.0,我正在编写一个iPhone应用程序,它使用cocoalibspotify。在我的一个视图中,我希望能够在表视图中显示播放列表的所有曲目。每个单元格应显示艺术家、唱片集和曲目名称。我已经实现了一种异步检索播放列表内容的方法,但是我还没有找到在后台线程上将SPPlaylistItems“转换”为SPTrack对象的正确方法。因此,每次检索播放列表曲目时,我的UI都会滞后。诚然,延迟很小,但仍然令人讨厌。下面是我检索播放列表内容的方法 -(void)getPlaylistContentAsynchro

我正在编写一个iPhone应用程序,它使用cocoalibspotify。在我的一个视图中,我希望能够在表视图中显示播放列表的所有曲目。每个单元格应显示艺术家、唱片集和曲目名称。我已经实现了一种异步检索播放列表内容的方法,但是我还没有找到在后台线程上将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); });
        }
    });
}
-(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方法。在这个方法的回调中,我将轨迹添加到数组中。这就是问题所在:在主线程中添加这些对象会导致一些延迟。所以我的问题是:

  • 这是检索SPPlaylist中所有SPTrack对象的正确方法吗?如果没有,那么在后台线程上执行此操作的正确方法是什么,这样我的UI就不会被阻止
    感谢您的帮助,谢谢

    通过URL创建新曲目的效率极低,
    SPPlaylistItem
    包含曲目本身

    将通过URL获取曲目的部分替换为类似的内容,您应该可以:

    for (SPPlaylistItem *item in playlist.items) {
        if (item.itemClass == [SPTrack class])
            [mutableArray addObject:item.item];
    }
    
    另外,值得注意的是,一次从播放列表中获取所有曲目是一个相当糟糕的主意——播放列表变得非常大,当你一次在屏幕上只有20首左右的曲目时,保留10000首曲目会让你很快耗尽内存