一种可能的解决方法是使用谓词创建自定义查询。这可以通过使用MPMediaQuery items 数组而不是collections 数组来实现。 collections 数组是 MPMediaItemCollections 的数组。 items 数组是MPMediaItems 的数组,因此您可以通过MPMediaItemPropertyMediaType 过滤查询。 MPMediaItemPropertyMediaType 仅适用于 MPMediaItem 而不是 MPMediaItemCollection。
使用一组基于播放列表标题和媒体类型的谓词初始化查询。这将选择您的播放列表并从查询中过滤掉所有视频:
NSString *playlistName = @"MyPlaylist";
MPMediaPropertyPredicate *playlistPredicate = [MPMediaPropertyPredicate predicateWithValue:playlistName
forProperty:MPMediaPlaylistPropertyName];
NSNumber *mediaTypeNumber = [NSNumber numberWithInteger:MPMediaTypeMusic]; // == 1
MPMediaPropertyPredicate *mediaTypePredicate = [MPMediaPropertyPredicate predicateWithValue:mediaTypeNumber
forProperty:MPMediaItemPropertyMediaType];
NSSet *predicateSet = [NSSet setWithObjects:playlistPredicate, mediaTypePredicate, nil];
MPMediaQuery *mediaTypeQuery = [[MPMediaQuery alloc] initWithFilterPredicates:predicateSet];
[mediaTypeQuery setGroupingType:MPMediaGroupingPlaylist];
如果您从 MPMediaQuery collections 数组返回数组,这些 MPMediaPropertyPredicates 将不会过滤。您应该会在日志语句中看到 1 以外的媒体项目类型:
NSArray *playlistCollections = [mediaTypeQuery collections];
[playlistCollections enumerateObjectsUsingBlock:^(MPMediaPlaylist *playlist, NSUInteger idx, BOOL *stop) {
NSLog (@"Playlist title: %@", [playlist valueForProperty:MPMediaPlaylistPropertyName]);
NSArray *songs = [playlist items];
[songs enumerateObjectsUsingBlock:^(MPMediaItem *song, NSUInteger idx, BOOL *stop) {
NSString *songTitle = [song valueForProperty:MPMediaItemPropertyTitle];
NSInteger mediaValue = [[song valueForProperty:MPMediaItemPropertyMediaType] integerValue];
if (mediaValue != 1)
NSLog(@"title: %@ - media type value: %d", songTitle, mediaValue);
}]; // Should return other media types here.
}];
如果您从MPMediaQuery items 返回数组,MPMediaPropertyPredicates 将过滤:
NSArray *playlistItems = [mediaTypeQuery items];
[playlistItems enumerateObjectsUsingBlock:^(MPMediaItem *song, NSUInteger idx, BOOL *stop) {
NSString *songTitle = [song valueForProperty: MPMediaItemPropertyTitle];
NSInteger mediaValue = [[song valueForProperty:MPMediaItemPropertyMediaType] integerValue];
if (mediaValue != 1)
NSLog(@"title: %@ - media type value: %d", songTitle, mediaValue);
}]; // Should return nothing here.
您还可以通过仅使用 songsQuery 上的 mediaTypePredicate 将媒体类型过滤器应用于整个库:
MPMediaQuery *query = [MPMediaQuery songsQuery];
[query setGroupingType:MPMediaGroupingPlaylist];
[mediaTypeQuery addFilterPredicate:mediaTypePredicate];
NSArray *playlists = [query items];