【问题标题】:Can't retrieve all user playlists无法检索所有用户播放列表
【发布时间】:2014-04-03 05:13:10
【问题描述】:

我正在尝试检索用户的播放列表。我参考了 cocoalibspotify 中的 Guess The Intro 样本,但是我只得到了 2 首曲目,其中来自已加星标的曲目。 有什么我错过的吗?另外,api/toplists 可以替代吗?我更习惯于使用 json 数据,所以如果有替代 cocoalibspotify 来检索用户的播放列表,我想尝试一下。

-(NSArray *)tracksFromPlaylistItems:(NSArray *)items {

NSMutableArray *tracks = [NSMutableArray arrayWithCapacity:items.count];

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

return [NSArray arrayWithArray:tracks];
}
-(void)getMyTracks {
    [SPAsyncLoading waitUntilLoaded:[SPSession sharedSession] timeout:kSPAsyncLoadingDefaultTimeout then:^(NSArray *loadedSession, NSArray *notLoadedSession) {
        NSLog(@"SPOTIFY [%@ %@]: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), @"Session loaded.");

        [SPAsyncLoading waitUntilLoaded:[SPSession sharedSession] timeout:kSPAsyncLoadingDefaultTimeout then:^(NSArray *loadedContainers, NSArray *notLoadedContainers) {
            NSLog(@"[%@ %@]: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), @"Container loaded.");

            NSMutableArray *playlists = [NSMutableArray array];
            [playlists addObjectsFromArray:[SPSession sharedSession].userPlaylists.playlists];
            [playlists addObject:[SPSession sharedSession].starredPlaylist];
            [playlists addObject:[SPSession sharedSession].inboxPlaylist];
            //[playlists addObjectsFromArray:[SPSession sharedSession].userPlaylists.flattenedPlaylists];

            [SPAsyncLoading waitUntilLoaded:playlists timeout:kSPAsyncLoadingDefaultTimeout then:^(NSArray *loadedPlaylists, NSArray *notLoadedPlaylists) {
                // All of our playlists have loaded their metadata — wait for all tracks to load their metadata.
                NSLog(@"[%@ %@]: %@ of %@ playlists loaded.", NSStringFromClass([self class]), NSStringFromSelector(_cmd),
                      [NSNumber numberWithInteger:loadedPlaylists.count], [NSNumber numberWithInteger:loadedPlaylists.count + notLoadedPlaylists.count]);
                NSArray *playlistItems = [loadedPlaylists valueForKeyPath:@"@unionOfArrays.items"];
                NSArray *tracks = [self tracksFromPlaylistItems:playlistItems];

                [SPAsyncLoading waitUntilLoaded:tracks timeout:kSPAsyncLoadingDefaultTimeout then:^(NSArray *loadedTracks, NSArray *notLoadedTracks) {
                    // All of our tracks have loaded their metadata. Hooray!
                    NSLog(@"[%@ %@]: %@ of %@ tracks loaded.", NSStringFromClass([self class]), NSStringFromSelector(_cmd),
                          [NSNumber numberWithInteger:loadedTracks.count], [NSNumber numberWithInteger:loadedTracks.count + notLoadedTracks.count]);
                    NSMutableArray *theTrackPool = [NSMutableArray arrayWithCapacity:loadedTracks.count];
                    for (SPTrack *track in loadedTracks) {
                        if (track.availability == SP_TRACK_AVAILABILITY_AVAILABLE && [track.name length] > 0) {

                            NSLog(@"TRACK %@ %@ %@",track.name,track.artists,track.album.name);
                        }
                    }
                }];
            }];
        }];
    }];
}

【问题讨论】:

    标签: ios spotify cocoalibspotify-2.0


    【解决方案1】:

    Guess Intro 不会尝试加载所有播放列表 - 它只是在几秒钟内完成它可以加载的内容并随之完成。

    在 CocoaLibSpotify 中加载整个播放列表树(尤其是如果您还尝试加载所有曲目)可能需要很长时间,尤其是在第一次运行时,因为没有缓存任何内容。

    通常,对于 UI,您只想加载播放列表以进行显示(而不是它们的曲目)。当用户选择播放列表时,您便开始加载曲目以进行显示。

    像 Guess the Intro 那样一次加载所有播放列表及其所有曲目确实会给系统带来很大压力,并且所有元数据都需要很长时间才能加载。如果您真的,真的必须一次加载所有内容,1) 准备来自拥有大量/大型播放列表的用户的崩溃报告,以及 2) 提供更长的超时时间。

    【讨论】:

    • 我明白了。关于先加载播放列表,然后在选择播放列表后加载曲目,您有一个很好的观点。我还通过将 .userplaylists 放在第二个 SPAsyncLoad 上的 [SPSession sharedSession] 上解决了我的问题。但是,我在没有封面的专辑上遇到错误。
    • 正如您在另一个问题中提到的,我必须删除为空的封面艺术。我正在考虑一种用默认图像替换它的方法。这可以通过创建一个 SPImage 并将其放置到包含空值的项目中来完成吗?我如何开始创建 SPImage?
    • 嗨@iKenndac,我已经能够通过取消注释 [playlists addObjectsFromArray:[SPSession sharedSession].userPlaylists.flattenedPlaylists] 来使其工作;但是它会在某些项目上导致 [NSNULL isLoaded] 并且我的应用程序崩溃。有什么建议吗?
    猜你喜欢
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    相关资源
    最近更新 更多