1

我在 MPMediaItemsCollection 中设置了 N 个项目,其中一些项目不是唯一的(该集合代表一个播放列表,同一首歌曲可能会出现两次)。

- (void)setLastSongWithItemCollection:(MPMediaItemCollection *)itemCollection
{
    [_musicPlayer setQueueWithItemCollection: itemCollection];
    NSLog(@"itemCollection count %u", itemCollection.count);
    NSLog(@"itemCollection lastObject index: %u", [itemCollection.items indexOfObject:itemCollection.items.lastObject]);
    _musicPlayer.nowPlayingItem = [[itemCollection items] lastObject];

}

在一个示例中,我正在生成包含 4 首歌曲的 itemCollection,其中最后一首歌曲是第一首重复的歌曲。如果我尝试获取列表中的最后一个对象,_musicPlayer 将始终播放第一个项目。

第一个 NSLog 打印“itemCollection count 4”,清楚地表明 items 数组中有四个项目。但是,第二个 NSLog 打印“itemCollection lastObject index:0”,表示 items.lastObject 不返回对象和最后一个索引,而是返回相同媒体项出现的第一个索引。

任何人都可以对此有所了解吗?

更正:正如所指出的,indexOfObject:不是返回重复对象索引的有效测试

尽管如此,_musicPlayer.nowPlayingItem = [[itemCollection items] lastObject] 将与 lastObject 相同的第一个实例设置为媒体播放器。似乎 nowPlayingItem 设置器在 itemCollection 上调用 indexOfObject:。解决方法?

跟进

似乎没有办法在 MPMediaPlayer 的队列中选择索引,并且setNowPlayingItem:调用indexOfObject:来查找选定的媒体项。结果是indexOfNowPlayingItem将返回队列中与 nowPlayingItem 相同的第一个实例的索引。就我而言,这会影响我在应用程序中的队列的视觉表示(它是一个滚动视图,每首歌曲都有一个面板)。MPMediaItemCollection 可能不适用于 MPMediaItems 可以多次出现的播放列表。为了获得有关该主题的更多信息,我将填写一份错误报告。

4

1 回答 1

2

这实际上与 MPMediaItemsCollection 无关。相反,这只是 NSArray 的行为。

作为-[NSArray indexOfObject:]状态的文档,它“返回对应数组值等于给定对象的最低索引”。-isEqual:在这种情况下,通过向每个对象发送消息来确定相等性。

所以,如果你有一个数组:

NSArray *array = @[@"A", @"B", @"C", @"A"];

您将看到以下内容:

[array indexOfObject:@"A"] // returns 0
[array indexOfObject:array[3]] // also returns 0
[array indexOfObject:[array lastObject]] // also returns 0

本质上,-[NSArray indexOfObject]看起来像这样:

- (void)indexOfObject:(id)object
{
    for (NSUInteger i=0; i<[self count]; i++) {
        if ([self[i] isEqual:object]) return i;
    }
    return NSNotFound;
}

如果您想知道数组中所有匹配对象的索引,请使用-[NSArray indexesOfObjectsPassingTest:]

NSArray *array = @[@"A", @"B", @"C", @"A"];
NSIndexSet *indexes = [array indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    return [obj isEqual:@"A"];
}];
NSLog(@"Indexes: %@", indexes);

>>Indexes: <NSIndexSet: 0x7fbc9b40b170>[number of indexes: 2 (in 2 ranges), indexes: (0 3)]

如果您确实需要知道哪个索引应该与您使用播放列表中的非唯一项目相关联,那么您必须在首先检索媒体项目时通过存储它自己来跟踪它。

于 2013-01-25T19:10:27.843 回答