Iphone 使用函数“一次查询两首或多首歌曲”;addFilterPredicate";按MPMediaItemPropertyPersistentID

Iphone 使用函数“一次查询两首或多首歌曲”;addFilterPredicate";按MPMediaItemPropertyPersistentID,iphone,cocoa-touch,mpmediaquery,Iphone,Cocoa Touch,Mpmediaquery,我的应用程序在启动时自动加载音乐播放列表。为了做到这一点,我将歌曲IDMPMediaItemPropertyPersistentID存储到数据库中,并在下次启动应用程序时加载歌曲。主要代码如下: MPMediaQuery *MPMediaSongQuery = [MPMediaQuery songsQuery]; MPMediaPropertyPredicate *iPodMusicSongPredicateiPodMusicSongPredicate = [MPMediaPropertyPr

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

MPMediaQuery *MPMediaSongQuery = [MPMediaQuery songsQuery];

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

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

代码一首接一首地加载歌曲。我的问题是:在使用函数
addFilterPredicate:
时,是否有任何方法可以通过
MPMediaItemPropertyTypersTestId
一次查询两首或多首歌曲?谢谢。

如果您使用多个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];

}
MPMediaQuery*MPMediaSongQuery=[MPMediaQuery-songsQuery];
NSMutableArray*集合=[[NSMutableArray alloc]initWithCapacity:1];
对于(int i=0;i

如果使用多个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];

}
MPMediaQuery*MPMediaSongQuery=[MPMediaQuery-songsQuery];
NSMutableArray*集合=[[NSMutableArray alloc]initWithCapacity:1];
对于(int i=0;i

关键是只对音乐库进行一次查询。您的代码仍然请求i次…关键是只对音乐库进行一次查询。您的代码仍然请求i次。。。