带有重复对象的indexOfObject

时间:2013-11-28 14:31:41

标签: ios objective-c cocoa-touch cocoa nsarray

我有一个NSArray的歌曲,并希望将它们放在播放列表中。当我播放播放列表时,我使用indexOfObject来计算队列中的当前歌曲索引。我已经覆盖了isEqual,所以要表明两个媒体项目是相同的,并且不希望破解这种方法。我尝试了NSOrderedSet而不是NSArray,它显示了每首歌一次,而不是同一首歌中有多少个实例。它们是一个混合NSArray和NSOrderedSet的类,以便每个索引都是唯一的对象,但在不同的索引处可能有重复的对象吗?

代码:

- (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然后再播放1   那么2然后3然后再3。这是不可能的,因为   indexOfObject始终返回第一个重复对象。

1 个答案:

答案 0 :(得分:0)

问题在于您找到播放列表当前播放的哪首歌曲:您似乎将currentSong存储在ivar左右。

由于这首歌可能在播放列表中出现两次,因此知道正在播放的内容的信息不足。例如:

“我的播放列表是A,A,B,C,C。现在A正在播放。”

正如您所看到的,根据这些信息,您无法知道下一首歌是什么。

解决方案是将索引存储在播放列表或其他一些信息中,以了解播放列表中的进度。