1

我正在尝试访问用户的本地音乐库,使用MPMediaQuery以下方式对结果进行排序:

Artist A (sorted alphabetically) > All of Artist A's albums, sorted alphabetically
Artist B (sorted alphabetically) > All of Artist B's albums, sorted alphabetically
Artist C (sorted alphabetically) > All of Artist C's albums, sorted alphabetically
...

我的查询结构如下:

MPMediaQuery *albumsQuery = [MPMediaQuery albumsQuery];
albumsQuery.groupingType = MPMediaGroupingAlbumArtist;

但问题是,虽然上述大部分都有效,但每个给定艺术家只返回第一张专辑。也就是说,只返回 Alt-J 的一张专辑,而不是库中存在的两张专辑。

这是为什么?以及如何构造我的查询以返回所需的结果?

编辑:这就是我访问相册查询的方式:

AlbumCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellID forIndexPath:indexPath];
MPMediaItemCollection *collection = [_items objectAtIndex:indexPath.row];
MPMediaItem *cellItem = [collection representativeItem];

_items包含MPMediaQuery' 结果的 NSArray在哪里。

4

3 回答 3

6

对于大型库,David Barsky 的算法似乎超级慢。我采取了不同的方法:

-(NSArray *)albumsSortedByArtist
{
    CFTimeInterval start = CACurrentMediaTime();
    MPMediaQuery *albumsQuery = [MPMediaQuery albumsQuery];

    NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"representativeItem"
                                                         ascending:YES comparator:^NSComparisonResult(MPMediaItem * _Nonnull album1, MPMediaItem * _Nonnull album2) {
                                                                 NSString *album1Name = [album1 valueForProperty:MPMediaItemPropertyAlbumArtist];
                                                                 NSString *album2Name = [album2 valueForProperty:MPMediaItemPropertyAlbumArtist];
                                                                 if (!album1Name || !album2Name) {
                                                                     album1Name = [album1 valueForProperty:MPMediaItemPropertyArtist];
                                                                     album2Name = [album2 valueForProperty:MPMediaItemPropertyArtist];
                                                                 }
                                                                 return [album1Name localizedStandardCompare:album2Name];
                                                             }];
    NSArray *allAlbums = [albumsQuery.collections sortedArrayUsingDescriptors:@[sorter]];
    NSLog(@"It took %f", CACurrentMediaTime() - start);
    return allAlbums;
}

它要快得多。在具有 1161 个专辑的 iPhone 6 库上:

2016-06-07 20:28:51.620 Musica[1205:515625] Mine: 0.394556
2016-06-07 20:29:20.528 Musica[1205:515625] David Barsky's: 28.906980
于 2016-06-07T18:30:36.803 回答
0

您如何从查询中访问相册?有 items 方法,或者,如果我没记错的话,还有 collection 方法。它们在为您提供数据的方式上有所不同。

显然,您可以自己手动完成所有操作,只需获取所有专辑的列表并自行排序!

编辑 I:按专辑艺术家分组意味着该集合为您提供每个专辑艺术家,然后获得代表性项目基本上只是一张专辑。因此,您需要对收藏进行另一次查询以获取该艺术家的每张专辑

编辑二:您可以使用您已经找到的内容进行其他查询,例如,您已经拥有的是所有不同专辑艺术家的集合。您想知道每个艺术家的专辑是什么,以便您可以使用附加谓词重复查询:

MPMediaItem* 专辑艺术家;// 先前来源的 MPMediaQuery* albumQuery = [MPMediaQuery albumsQuery]; MPMediaPropertyPredicate* albumPredicate = [MPMediaPropertyPredicate predicateWithValue: [albumArtist valueForProperty: MPMediaItemPropertyAlbumArtist] forProperty: MPMediaItemPropertyAlbumArtist]; [albumQuery addFilterPredicate: albumPredicate]; NSArray* allAlbums = [albumQuery 集合];

于 2015-03-21T20:39:50.520 回答
0

以下作品(慢慢地,在一个相当大的音乐库上。你的结果可能会有所不同)。归功于 CMash的帮助。

- (NSArray *)queryForMusic {
    NSMutableArray *allAlbums = [[NSMutableArray alloc] init];

    MPMediaQuery *artistsQuery = [MPMediaQuery artistsQuery];
    artistsQuery.groupingType = MPMediaGroupingAlbumArtist;
    NSArray *allArtists = [artistsQuery collections];

    for (MPMediaItemCollection *collection in allArtists) {
        MPMediaItem *albumArtist = [collection representativeItem];

        MPMediaQuery *albumQuery = [MPMediaQuery albumsQuery];
        MPMediaPropertyPredicate* albumPredicate = [MPMediaPropertyPredicate predicateWithValue: [albumArtist valueForProperty: MPMediaItemPropertyAlbumArtist] forProperty: MPMediaItemPropertyAlbumArtist];
        [albumQuery addFilterPredicate: albumPredicate];

        NSArray *artistsAblums = [albumQuery collections];
        [allAlbums addObjectsFromArray:artistsAblums];
    }

    return allAlbums;
}
于 2015-03-23T13:29:42.880 回答