Получить список песен, упорядоченных по времени последнего воспроизведения в iOS

Мне нужно получить список из N самых последних воспроизводимых песен с устройства iOS по порядку.

Единственный способ, которым я могу себе представить, это сделать на данный момент, пройдя все песни через MPMediaQuery и вручную сортировать их по lastPlayedDate,

Это потенциально дорогая операция, и мне было интересно, есть ли лучший подход.


Изменить: после некоторых испытаний, это очень дорогая операция. В тестовой библиотеке из 2500 песен потребовалось около 20 секунд, чтобы:

  1. Получить все песни.
  2. Назначьте дату всем песням, которые никогда не играли (1 января 1970 года).
  3. Заказать их по дате.
  4. Получить первые N записей.

Любое предложение об улучшениях будет оценено.


Редактировать 2: Решено сейчас, но просто для записи вот что я делал.

Я сортировал, используя блок, как описано здесь: /questions/1431564/kak-mne-otsortirovat-nsmutablearray-s-polzovatelskimi-obektami-v-nem/1431605#1431605. Простое изменение метода сортировки на ответ Брайана увеличило мою скорость почти на 20 раз на iPod Touch 3.

2 ответа

Решение

Один из способов - взять массив MPMediaItemвы получаете от MPMediaQuery и сортировать по MPMediaItemPropertyLastPlayedDate используя NSSortDescriptor:

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 секунды.

Я думаю 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

Другие вопросы по тегам