检索iOS中按上次播放时间排序的歌曲列表

时间:2013-02-01 17:20:12

标签: ios ipod mpmediaquery

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

目前我能想象的唯一方法是将所有歌曲通过MPMediaQuery并按lastPlayedDate手动排序。

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


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

  1. 获取所有歌曲。
  2. 为所有从未播放过的歌曲(1970年1月1日)指定日期。
  3. 按日期订购。
  4. 获取第一个 N 条目。
  5. 任何有关改进的建议都将受到赞赏。


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

    我正在使用此处所述的块进行排序:https://stackoverflow.com/a/805589/112702。简单地将排序方法改为布莱恩的答案,在iPod Touch 3上将我的速度提高了近20倍。

2 个答案:

答案 0 :(得分:8)

一种方法是从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);

这是按照最近播放的新阵列进行排序。我使用2000首歌曲在iPhone 4S上进行了测试,花了0.98秒。

答案 1 :(得分: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