查询按专辑标题和曲目编号排序的MPMediaItems

时间:2013-08-24 07:43:21

标签: ios sorting nssortdescriptor mpmediaitem

我正在尝试获取用户iPhone库中所有视频项目的列表,并按照“专辑名称”排序,然后按“跟踪编号”排序(根据这个概念,这将放置所有电视节目和播客在适当的节目/剧集顺序)。事实是,我无法找到一种方法来通过这样的两个参数对MPMediaItems进行排序。

现在,我设置了这样的查询:

MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithInteger:MPMediaTypeAnyVideo] forProperty:MPMediaItemPropertyMediaType];

MPMediaQuery *query = [[MPMediaQuery alloc] init];
[query addFilterPredicate:predicate];

NSArray *arrayMediaItems = [[NSArray alloc] init];
arrayMediaItems = [query items];

然后我按照这样排序:

NSArray *sortedArray = [arrayMediaItems sortedArrayUsingComparator:^(id a, id b) {
    NSNumber *first = [(MPMediaItem*)a valueForProperty:MPMediaItemPropertyAlbumTitle];
    NSNumber *second = [(MPMediaItem*)b valueForProperty:MPMediaItemPropertyAlbumTitle];
    return [first compare:second];
}];

事情是,返回一个列表,其中所有相册(读取:显示)的顺序正确,但其中的剧集只是按字母顺序排列,这显然是不对的。我尝试这样做:

NSSortDescriptor *sortAlbum = [[NSSortDescriptor alloc] initWithKey:@"MPMediaItemPropertyAlbumTitle" ascending:YES];
NSSortDescriptor *sortTrackNum = [[NSSortDescriptor alloc] initWithKey:@"MPMediaItemPropertyAlbumTrackNumber" ascending:YES];
NSArray *sortDescriptors = @[sortAlbum, sortTrackNum];
sortedArray = [arrayMediaItems sortedArrayUsingDescriptors:sortDescriptors];

但我收到错误:this class is not key value coding-compliant for the key MPMediaItemPropertyAlbumTitle。据我了解,这是因为我试图按属性而不是键进行排序。

所以我的问题是:如何按多种因素排序MPMediaItems?我可以订购初始结果(例如按曲目编号而不是按标题按字母顺序排列),然后按专辑名称排序吗?有没有办法将NSSortDescriptorsortedArrayUsingComparator用于两个维度?

最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

将此视为评论。因为我无法在那里发布图片。

enter image description here

enter image description here

以上图片是MediaPlayer框架常量的屏幕截图。你说没有“MPMediaItemPropertyAlbumTitle”和“MPMediaItemPropertyAlbumTrackNumber”这样的属性。因为它们是某些其他属性的常量。

尝试使用albumTitlealbumTrackNumber代替“MPMediaItemPropertyAlbumTitle”和“MPMediaItemPropertyAlbumTrackNumber

答案 1 :(得分:0)

我最终找到了来自this question的代码示例。我正在处理的项目少于1,200项,因此问题中的代码或答案对我来说都有用,但我在答案中使用的是效率。 (除了专辑标题之外,它还使用MPMediaItemPropertyAlbumPersistentID,我喜欢用它来检查具有相同标题的专辑/节目。)

sortedArray = [arrayMediaItems sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    NSComparisonResult compareResult;

    NSString *first1 = [(MPMediaItem*)a valueForProperty:MPMediaItemPropertyAlbumTitle];
    if(first1 == nil) first1 = @" "; // critical because compare will match nil to anything and result in NSOrderedSame
    NSString *second1 = [(MPMediaItem*)b valueForProperty:MPMediaItemPropertyAlbumTitle];
    if(second1 == nil) second1 = @" ";  // critical because compare will match nil to anything and result in NSOrderedSame
    compareResult = [first1 compare:second1];

    if (compareResult == NSOrderedSame) {
        NSString *first2 = [(MPMediaItem*)a valueForProperty:MPMediaItemPropertyAlbumPersistentID];
        NSString *second2 = [(MPMediaItem*)b valueForProperty:MPMediaItemPropertyAlbumPersistentID];
        compareResult = [first2 compare:second2];
        if(compareResult == NSOrderedSame) {
            NSString *first3 = [(MPMediaItem*)a valueForProperty:MPMediaItemPropertyAlbumTrackNumber];
            NSString *second3 = [(MPMediaItem*)b valueForProperty:MPMediaItemPropertyAlbumTrackNumber];
            compareResult = [first3 compare:second3];
        }
    }
    return compareResult;
}];

我希望这有助于某人!