考えられる回避策の1つは、述語を使用してカスタムクエリを作成することです。MPMediaQuery
items
これは、アレイではなくアレイを使用して実装できますcollections
。collections
配列はsの配列ですMPMediaItemCollection
。items
配列はsの配列であるためMPMediaItem
、クエリを。でフィルタリングできます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];
MPMediaPropertyPredicate
配列から配列を返す場合、これらはフィルタリングされませんMPMediaQuery
collections
。ログステートメントに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.
}];
MPMediaPropertyPredicate
配列を次の場所から返す場合、sはフィルタリングされますMPMediaQuery
items
。
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];