8

我需要按顺序从 iOS 设备中获取最近播放的N首歌曲的列表。

目前,我能想象到的唯一方法是通过 an 获取所有歌曲MPMediaQuery并手动对它们进行排序lastPlayedDate

这是一个潜在的昂贵操作,我想知道是否有更好的方法。


编辑:经过一些测试,这是一项非常昂贵的操作。在包含 2500 首歌曲的测试库中,大约需要 20 秒:

  1. 获取所有歌曲。
  2. 为所有从未播放过的歌曲指定一个日期(1970 年 1 月 1 日)。
  3. 按日期订购。
  4. 获取前N个条目。

任何改进建议将不胜感激。


编辑2:现在解决了,但只是为了记录,这就是我正在做的事情。

我正在使用此处描述的块进行排序:https ://stackoverflow.com/a/805589/112702 。只需将排序方法更改为 Bryan 的答案,我在 iPod Touch 3 上的速度提高了近 20 倍。

4

2 回答 2

9

一种方法是MPMediaItem获取从 s 获得的数组,并使用 aMPMediaQuery对其进行排序: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);

这将按照最近播放的顺序对新数组进行排序。我在 iPhone 4S 上使用 2000 首歌曲进行了测试,耗时 0.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 回答