1

我正在尝试获取用户 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二维?

最好的方法是什么?

4

2 回答 2

1

将此视为评论。因为我不能在那里发布图像。

在此处输入图像描述

在此处输入图像描述

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

试试albumTitleandalbumTrackNumber而不是 " MPMediaItemPropertyAlbumTitle" 和 " MPMediaItemPropertyAlbumTrackNumber"

于 2013-08-24T08:28:14.550 回答
0

我最终从这个问题中找到了一个代码示例。我使用的项目少于 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;
}];

我希望这可以帮助别人!

于 2013-08-24T16:58:33.363 回答