2013-11-28 16 views
0

我有一個NSArray的歌曲,並希望將它們放入播放列表中。當我播放播放列表時,我使用indexOfObject來確定隊列中當前的歌曲索引。我已經覆蓋isEqual,所以爲了表明兩個媒體項目是相同的,並且不希望破解這種方法。我試用了NSOrderedSet而不是NSArray,它顯示每首歌曲一次,而不是同一首歌曲有多少個實例。他們是一個混合了NSArray和NSOrderedSet的類,以便每個索引都是唯一對象,但是在不同索引處可能存在重複對象?帶有重複對象的indexOfObject

代碼:

- (PlayerItem *)nextSong{ 
     if(queue.count > 0){ 
      NSInteger songIndex = [queue indexOfObject:currentSong]; 
      NSLog(@"%ld in %lu", (long)songIndex, (unsigned long)queue.count); 
      songIndex = songIndex + 1; 
      if (songIndex < [queue count]){ 
       return queue[songIndex]; 
      }else{ 
       return queue[0]; 
      } 
     } 
    } 
    return nil; 
} 

評論從下圖:

我的意思是,如果我循環扔歌曲比它可以1再次 然後2然後3然後3再次播放歌曲1即可。這是不可能的,因爲 indexOfObject總是返回第一個重複對象。

+0

我真的不明白你想達到什麼目的。任何對象在數據表示中都是唯一的。我不知道對象可能是獨特的,同時有重複的... – slecorne

+0

我的意思是如果我循環投擲歌曲比它可以播放歌曲1然後1再次然後2然後3然後再次3。這是不可能的,因爲indexOfObject總是返回第一個重複對象。 – kezi

+0

爲什麼使用'indexOfObject'來訪問播放列表中的歌曲?你是簡單地列舉播放列表的內容還是完全不同的東西? – neilco

回答

0

問題出在你從播放列表中找出哪首歌正在播放的方式:你似乎將currentSong存儲在ivar左右。

由於這首歌曲有可能在播放列表中出現兩次,因此只是沒有足夠的信息來知道播放的內容。例如:

「我的播放列表是A,A,B,C,C,現在A正在播放。」

正如你所看到的,從這些信息你不能知道下一首歌是什麼。

解決方案是將索引存儲在播放列表或其他信息中以瞭解播放列表中的進度。

+0

這就是我最終使用的路線,但我唯一的擔心是,當通過播放列表時,索引不會重置,並且會調用一個不可行的索引。我想這只是需要測試。謝謝! – kezi