SPTralaylist项目为SPTracks未加载(一致)

时间:2014-02-18 01:58:10

标签: ios spotify cocoalibspotify-2.0 libspotify

我一直在努力解决这个问题,并且正在寻找任何在iOS上使用CocoaLibSpotify的人的建议(确切地说是iOS 7)。

我正在尝试加载SPPlaylist中的所有(SPTrack)项目。我看过示例代码和文档,所以我知道观察事物的最佳方式是使用KVO,但是我无法看到这是最好的方式。

查看GitHub和网络上的“猜猜入”示例和其他来源,我正在做的事情如下:

  1. 获取SPPlaylist(直接来自用户播放列表或通过已保存的网址创建),
  2. 使用SPAsyncLoading
  3. 加载播放列表
  4. 循环通过SPPlaylist中返回的SPPlaylistItems并获取所有SPTrack对象,
  5. 将SPTrack对象数组传递给另一个SPAsyncLoading调用
  6. 显示loadedItems数组中的所有项目。
  7. 步骤5是事情似乎出错的地方。有时它很好,我得到播放列表显示的所有曲目。但是大多数情况下它不会加载它们,或只加载一些(通常很少)。

    我注意到重启手机有时会让它发挥作用。虽然在运行应用程序(或更改播放列表)几次后,它会再次停止工作。

    当我记录每一步时,我得到如下内容:

    -[ViewController sessionDidLoginSuccessfully:]
    Load playlist with URL: spotify:user:XXXXX:playlist:XXXXXXXXXXXXXXXXXXXXXX
    Created playlist: <SPPlaylist: 0x16775bc0>: (null) (0 items)
    Loaded playlist: <SPPlaylist: 0x16775bc0>: Playlist Name (59 items)
    Created SPTrack items: 59
    Loaded SPTrack items: 1
    Failed to load SPTrack items: 58
    

    如您所见,用户使用有效会话登录。每个步骤按计划工作直到结束。有时即使它确实加载了一个曲目,它也不允许我播放它,以及返回SP_TRACK_AVAILABILITY_UNAVAILABLE

    如果有帮助,我还在下面添加了一个代码段。但是,任何帮助都会对此表示感激。

    感谢。

    - (void)loadPlaylist
    {
        __weak NSURL *spotifyURL = <URL from saved SPPlaylist>;
        NSLog(@"Load playlist with URL: %@", spotifyURL);
        [SPPlaylist playlistWithPlaylistURL:spotifyURL inSession:[SPSession sharedSession] callback:^(SPPlaylist *playlist) {
            _spotifyPlaylist = playlist;
            NSLog(@"Created playlist: %@", _spotifyPlaylist);
            [SPAsyncLoading waitUntilLoaded: _spotifyPlaylist timeout:kSpotifyTimeout then:^(NSArray *loadedItems, NSArray *notLoadedItems) {
            NSLog(@"Loaded playlist: %@", _spotifyPlaylist);
            if ([loadedItems count] > 0)
                [self loadSpotifyPlaylist];
            }];
        }];
    }
    
    - (void)loadSpotifyPlaylist
    {
        NSArray *tracksArray = [self tracksFromPlaylistItems:[_spotifyPlaylist items]];
        NSLog(@"Created SPTrack items: %d", [tracksArray count]);
    
        if (tracksArray && [tracksArray count] > 0)
        {
            [SPAsyncLoading waitUntilLoaded:tracksArray timeout:kSpotifyTimeout then:^(NSArray *loadedItems, NSArray *notLoadedItems) {
                _playlist = loadedItems;
                NSLog(@"Loaded SPTrack items: %d", [loadedItems count]);
                NSLog(@"Failed to load SPTrack items: %d", [notLoadedItems count]);
    
            [self finishReloadData];
        }];
    }
    

    _spotifyPlaylist_playlist都是strong个实例,而tracksFromPlaylistItems:与“猜测信息”示例代码中使用的方法相同。

    修改kSpotifyTimeout超时设置为10.0

1 个答案:

答案 0 :(得分:0)

kSpotifyTimeout的价值是多少?我认为你所看到的仅仅是元数据需要花费很长时间才能加载的事实(特别是昨天Spotify后端似乎遇到麻烦,这可能会不时发生)。

通常,一次加载播放列表的全部内容是不好的做法,你会看到Guess the Intro实际上并不关心是否加载了所有曲目 - 它只是抓住加载的内容并使用它们游戏的轨道。

一个好的方法是分页加载播放列表曲目以匹配您的UI。也就是说,只加载用户可以看到的曲目,加上可能是“屏幕”或两个值得上下的曲目。当用户滚动时,您可以开始加载曲目 - UIScrollViewDelegate s -scrollViewWillEndDragging:withVelocity:targetContentOffset:对此特别有用,因为它可以让您看到用户将“登陆”并开始为该点加载曲目。有一些示例代码用于执行此操作以及一个名为SPSparseArray的帮助程序类,用于在CococaLibSpotify的dev分支上部分加载播放列表等内容(尽管请注意dev branch = beta quality)