我的应用会在启动时自动加载音乐播放列表。为此,我将歌曲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:
一次查询两首或更多首歌曲?感谢。
答案 0 :(得分:2)
如果您使用多个addFilterPredicate,它们将与逻辑AND结合使用。因此,您只能减少第一个查询的结果,但不能扩展它。因此,不允许对同一属性使用多个addFilterPredicates。事实上,结果是未定义的,很可能最终会出现在空集合中。您正在寻找的是相同属性与逻辑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];
}
...