使用MPMediaQuery加载播放列表

时间:2012-05-11 14:44:00

标签: ios xcode mpmediaquery

在我的应用中,我想在plist文件中保存用户播放列表,并在应用启动时加载此播放列表。

这是我用来保存的代码:

if (self.backgroundMusicItems) {
    NSMutableArray *songsID = [[NSMutableArray alloc] initWithCapacity:0];
    MPMediaItem *item;
    for (item in self.backgroundMusicItems.items) {
        NSNumber *songId = [item valueForProperty:MPMediaItemPropertyPersistentID];
        [songsID addObject:songId];
    }
    NSString *documentdir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [documentdir stringByAppendingPathComponent:@"playlist.plist"];
    [songsID writeToFile:filePath atomically:YES];
}

这是我用来加载的代码:

NSString *documentdir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [documentdir stringByAppendingPathComponent:@"playlist.plist"];

NSArray *myArray = [[NSArray alloc] initWithContentsOfFile:filePath];

NSMutableSet *predicates = [[NSMutableSet alloc] initWithCapacity:0];

if (myArray.count > 0) {
    NSNumber *songId;
    for (songId in myArray) {
        MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue:songId forProperty:MPMediaItemPropertyPersistentID];
        [predicates addObject:predicate];
    }
    MPMediaQuery *query = [[MPMediaQuery alloc] initWithFilterPredicates:predicates];

    NSArray *mediaItems = [query items];
    if (mediaItems.count > 0) [GameOptions sharedClass].backgroundMusicItems = [[MPMediaItemCollection alloc] initWithItems:mediaItems];
}

myArray包含2个项目,但[query items]方法返回0个项目。哪里我错了?

1 个答案:

答案 0 :(得分:0)

你要求的歌曲中MPMediaItemPropertyPersistentID设置为song1 AND song2的值 - 这将始终返回零结果,因为任何歌曲在逻辑上都不可能匹配两个不同的MPMediaItemPropertyPersistentID。

您需要为每个持久性ID运行查询。