1

ユーザーの iPhone ライブラリにあるすべてのビデオ アイテムのリストを取得し、最初にアルバム名で並べ替え、次にトラック番号で並べ替えようとしています (これにより、すべてのテレビ番組とポッドキャストが適切な場所に配置されるという考えに基づいています)。ショー/エピソード順)。MPMediaItems問題は、そのような 2 つのパラメーターで並べ替える方法がわかりません。

現在、次のようにクエリを設定しています。

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またはsortedArrayUsingComparator2次元で使用する方法はありますか?

これを行う最善の方法は何ですか?

4

2 に答える 2

1

これはコメントと考えてください。そこに画像を投稿できなかったので。

ここに画像の説明を入力

ここに画像の説明を入力

上記の画像は、MediaPlayerフレームワーク定数のスクリーンショットです。MPMediaItemPropertyAlbumTitleあなたは、「 」や「 」のようなプロパティはないと言っていますMPMediaItemPropertyAlbumTrackNumber。それらは他のいくつかのプロパティの定数であるためです。

" " と " "の代わりにalbumTitleandを試してくださいalbumTrackNumberMPMediaItemPropertyAlbumTitleMPMediaItemPropertyAlbumTrackNumber

于 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 に答える