【问题标题】:indexOfObject with Duplicate Objects具有重复对象的 indexOfObject
【发布时间】:2013-11-28 14:31:40
【问题描述】:

我有一个 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,然后再播放 1,然后再播放 2,然后再播放 3,然后再播放 3。这是不可能的,因为 indexOfObject 总是返回第一个重复的对象。
  • 为什么要使用indexOfObject 访问播放列表中的歌曲?您只是在列举播放列表的内容还是完全不同的内容?
  • 我在列举它。我有一个方法,通过获取当前歌曲的索引并添加一个来调用下一首歌曲。
  • 为什么要手动增加索引?如果您使用枚举,您将拥有索引。如果您使用快速枚举,您将拥有这首歌。你能给我们看一些代码吗?

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


【解决方案1】:

问题在于您找出播放列表中当前正在播放的歌曲的方式:您似乎将 currentSong 存储在 ivar 中。

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

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

如您所见,从这些信息中您无法知道下一首歌曲是什么。

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

【讨论】:

  • 那是我最终使用的路线,但我唯一担心的是,在浏览播放列表时,索引不会被重置,它会调用一个不可行的索引。我想这只是需要测试。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
相关资源
最近更新 更多