【问题标题】:Retrieve list of songs ordered by last play time in iOS在 iOS 中检索按最后播放时间排序的歌曲列表
【发布时间】:2013-01-17 01:56:17
【问题描述】:

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

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

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


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

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

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


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

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

【问题讨论】:

    标签: ios ipod mpmediaquery


    【解决方案1】:

    一种方法是从MPMediaQuery 获取MPMediaItems 数组,并使用NSSortDescriptorMPMediaItemPropertyLastPlayedDate 对其进行排序:

    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 秒。

    【讨论】:

    • 谢谢。似乎我使用的排序方法开销太大。
    【解决方案2】:

    我认为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

    【讨论】:

    • 这就是我尝试过的,但执行时间太长了。查看更新后的帖子。
    猜你喜欢
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多