2012-03-01 12 views
0

時には、トラックを「スター」するときに致命的な例外が発生することがあります。cocoalibspotify重いデータセット(何百ものプレイリストがありますが、<のスター付きトラック)を持つユーザーでログインしています。スター付きのプレイリストにトラックを追加するときにNSArray例外が発生する

これはどのようにI "スター" 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 
    ... 

これはのみ(ログインした後2分以内に発生するようですつまりユーザーデータがロードされている)、データが完全にロードされていないか、何か問題があると思いますか?

私は、すべてが完全にロードされた時を知るために観察するべきプロパティがあるかどうかを調べようとしました。しかし、配列が空である可能性があるため(ユーザーが以前にトラックに星印を付けていない可能性があります)、すべてがロードされていることを検証する良い方法はないようです...? loadedプロパティがSPPlaylistの場合、そのトラック(?)ではなく、プレイリストのメタデータを参照しているようです。

アイデア?

+0

は、あなたは私にあなたが配列「アイテム」をインスタンス化するところのコードを表示することができますか? – dbrajkovic

+1

実際、私はもう一度それを見るようになりました。 NSMutable配列を監視しているNSArrayのインスタンスがあるようです。そして、そのエラーを生成しているNSArrayです。 NSMutableArrayではありません。 – dbrajkovic

+0

はい、私はそれが 'cocoalibspotify'ライブラリの中で起こっていることを信じています。これは変更を扱うライブラリであり、この問題が関連しています。 https://github.com/spotify/cocoalibspotify/tree/master/commonの 'SPPlaylist.m'をチェックしてください。 –

答えて

1

あなたは、あなたがその配列を直接操作することになっていないように見えます。代わりに[myTrack setStarred:YES];

を呼び出してください。基本的に、私はSpotify API全体を調べてその答えを見つけました。このため

+0

あなたは、実際には正しいことを知っています!よくやった!他の状況ではトラックがプレイリストに追加される方法なので、別の方法でそれをやらなければならないと思いました。私は '-setStarred:'メソッドを見ましたが、その正確な理由でそれを無視しました。時には、あなたの前で答えを指す他の人が必要な場合もあります。 :) ありがとう! –

0

完全なコードサンプル:

-(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]; 

     }]; 
    } 
}]; 

}

関連する問題