【问题标题】:NSArray exception when adding track to starred playlist将曲目添加到已加星标的播放列表时出现 NSArray 异常
【发布时间】:2012-03-01 20:27:56
【问题描述】:

有时,当我尝试在 cocoalibspotify 中为曲目“加注星标”时,我遇到了一个致命的异常。我正在使用具有大量数据集(数百个播放列表,但

这就是我“明星”SPTrack

[[[[SPSession sharedSession] starredPlaylist] items] addObject:myTrack];

...和堆栈跟踪:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSArray objectsAtIndexes:]: index 12 beyond bounds [0 .. 11]'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x01e125a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x021a1313 objc_exception_throw + 44
    2   CoreFoundation                      0x01da0f99 -[NSArray objectsAtIndexes:] + 633
    3   Foundation                          0x016a250b -[NSKeyValueArray objectsAtIndexes:] + 110
    4   Foundation                          0x016aaca6 NSKeyValueDidChangeByArrayMutation + 103
    5   Foundation                          0x01610c30 NSKeyValueDidChange + 266
    6   Foundation                          0x016aba95 -[NSObject(NSKeyValueObserverNotification) didChange:valuesAtIndexes:forKey:] + 123
    7   Foundation                          0x016a4d0e -[NSKeyValueNotifyingMutableArray addObject:] + 239
    8   MyApp                               0x000922cd -[PlaylistManager starTrack:] + 285
    ...

这似乎只在登录后一两分钟内发生(即加载用户数据),所以我猜这可能是数据未完全加载或其他什么的问题?

我试图找出是否有任何要观察的属性,以便找出所有内容何时已完全加载。但是由于数组可能是空的(并且用户之前可能没有为任何曲目加注星标),似乎没有很好的方法来验证所有内容都已加载......? SPPlaylistloaded 属性似乎指的是播放列表元数据,而不是它的曲目 (?)。

有什么想法吗?

【问题讨论】:

  • 你能告诉我你在哪里实例化数组'items'的代码吗?
  • 其实,现在我再看一遍。看起来有一个 NSArray 实例正在观察 NSMutable 数组。正是 NSArray 产生了错误。不是 NSMutableArray。
  • 是的,我相信这就是 cocoalibspotify 库中发生的事情,这是处理更改的库(与此问题有关)。在github.com/spotify/cocoalibspotify/tree/master/common 中查看SPPlaylist.m

标签: ios spotify playlist


【解决方案1】:

你得到了所以看起来你不应该直接操作那个数组。而是致电[myTrack setStarred:YES];

基本上,我只是通过整个 Spotify API 来为您找到答案。

【讨论】:

  • 您知道,您实际上是对的!做得好!我想我必须反过来做,因为这就是在其他情况下将曲目添加到播放列表的方式。我见过-setStarred: 方法,但出于这个确切原因忽略了它......有时你只需要其他人指出你面前的答案。 :) 非常感谢!
【解决方案2】:

完整的代码示例:

-(void)starTrack:(NSString *)uri {

NSURL *trackURL = [NSURL URLWithString:uri];

[[SPSession sharedSession] trackForURL:trackURL callback:^(SPTrack *track) {

    if (track != nil) {

        [SPAsyncLoading waitUntilLoaded:track timeout:kSPAsyncLoadingDefaultTimeout then:^(NSArray *tracks, NSArray *notLoadedTracks) {

            [track setStarred:YES];

        }];
    }
}];

}

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多