我正在尝试获取用户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
?我可以订购初始结果(例如按曲目编号而不是按标题按字母顺序排列),然后按专辑名称排序吗?有没有办法将NSSortDescriptor
或sortedArrayUsingComparator
用于两个维度?
最好的方法是什么?
答案 0 :(得分:1)
将此视为评论。因为我无法在那里发布图片。
以上图片是MediaPlayer
框架常量的屏幕截图。你说没有“MPMediaItemPropertyAlbumTitle
”和“MPMediaItemPropertyAlbumTrackNumber
”这样的属性。因为它们是某些其他属性的常量。
尝试使用albumTitle
和albumTrackNumber
代替“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;
}];
我希望这有助于某人!