8

最近再生されたN曲のリストをiOSデバイスから順番に取得する必要があります。

現時点で私が想像できる唯一の方法は、すべての曲を取得し、MPMediaQuery手動で並べ替えることlastPlayedDateです。

これは潜在的に費用のかかる操作であり、より良いアプローチがあるかどうか疑問に思いました。


編集:いくつかのテストの後、これは非常に費用のかかる操作です。2500曲のテストライブラリでは、次の作業に約20秒かかりました。

  1. すべての曲を入手してください。
  2. 再生したことがないすべての曲に日付を割り当てます(1970年1月1日)。
  3. 日付順に注文してください。
  4. 最初のNエントリをフェッチします。

改善の提案をいただければ幸いです。


編集2:今解決しましたが、記録のために、これが私が行っていたことです。

ここで説明されているように、ブロックを使用して並べ替えていました:https ://stackoverflow.com/a/805589/112702 。並べ替え方法をブライアンの答えに変更するだけで、iPodTouch3の速度が約20倍向上しました。

4

2 に答える 2

9

1つの方法は、から取得したsの配列をMPMediaItem取得し、 :を使用してMPMediaQuery並べ替えることです。MPMediaItemPropertyLastPlayedDateNSSortDescriptor

NSTimeInterval start  = [[NSDate date] timeIntervalSince1970];

MPMediaQuery *songsQuery = [MPMediaQuery songsQuery];
NSArray *songsArray = [songsQuery items];

NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:MPMediaItemPropertyLastPlayedDate
                                                         ascending:NO];
NSArray *sortedSongsArray = [songsArray sortedArrayUsingDescriptors:@[sorter]];

NSTimeInterval finish = [[NSDate date] timeIntervalSince1970];
NSLog(@"Execution took %f seconds.", finish - start);

これにより、新しいアレイが最近再生されたものから順に並べ替えられます。これをiPhone4Sで2000曲を使用してテストしたところ、.98秒かかりました。

于 2013-02-04T18:37:33.200 に答える
0

MPMediaQuery現時点では、iOSデバイスから最近再生された曲を取得する唯一の方法だと思います。

MPMediaItemPropertyLastPlayedDateユーザーがメディアアイテムを再生した最新のカレンダー日時を返すプロパティを使用できます。値はNSDateオブジェクトです。

http://developer.apple.com/library/IOs/#documentation/MediaPlayer/Reference/MPMediaItem_ClassReference/Reference/Reference.html#//apple_ref/doc/constant_group/General_Media_Item_Property_Keys

于 2013-02-01T19:46:51.170 に答える