1

我的应用程序在启动时会自动加载音乐播放列表。为此,我将歌曲 ID 存储MPMediaItemPropertyPersistentID到数据库中,并在下次启动应用程序时加载歌曲。主要代码如下:

MPMediaQuery *MPMediaSongQuery = [MPMediaQuery songsQuery];

MPMediaPropertyPredicate *iPodMusicSongPredicateiPodMusicSongPredicate = [MPMediaPropertyPredicate 
                                  predicateWithValue:[NSNumber numberWithUnsignedLongLong: songID] 
                                  forProperty:MPMediaItemPropertyPersistentID     
                                  comparisonType:MPMediaPredicateComparisonEqualTo];

[MPMediaSongQuery addFilterPredicate:iPodMusicSongPredicate];
NSArray *collections = MPMediaSongQuery.collections;

代码一一加载歌曲。MPMediaItemPropertyPersistentID我的问题是:有没有办法在使用该功能时一次查询两首或多首歌曲addFilterPredicate:?谢谢。

4

1 回答 1

1

如果您使用多个 addFilterPredicate,它们将与逻辑 AND 组合。所以你只能减少第一个查询的结果,但不能扩展它。因此,您不允许对同一属性使用多个 addFilterPredicate。事实上,结果是未定义的,很可能最终会出现在一个空集合中。您正在寻找的是相同属性与逻辑 OR 的组合。您可以像下面的伪代码中描述的那样实现这一点:

MPMediaQuery *MPMediaSongQuery = [MPMediaQuery songsQuery];

NSMutableArray *collections = [[NSMutableArray alloc] initWithCapacity:1];

for (int i=0; i < songIDCount; i++) {

   MPMediaPropertyPredicate *iPodMusicSongPredicateiPodMusicSongPredicate = [MPMediaPropertyPredicate 
                                  predicateWithValue:[NSNumber numberWithUnsignedLongLong: songID[i]] 
                                  forProperty:MPMediaItemPropertyPersistentID     
                                  comparisonType:MPMediaPredicateComparisonEqualTo];

   [MPMediaSongQuery addFilterPredicate:iPodMusicSongPredicate];

   [collections addObjectsFromArray:MPMediaSongQuery.collections];

   [MPMediaSongQuery removeFilterPredicate:iPodMusicSongPredicate];

}

...

于 2011-04-20T06:11:25.100 回答