关于MPMediaItemCollection项lastObject

时间:2013-01-25 18:39:57

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

我在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 setter调用indexOfObject:on itemCollection。解决方法?

后续

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

1 个答案:

答案 0 :(得分: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)]

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