Получить список песен, упорядоченных по времени последнего воспроизведения в iOS
Мне нужно получить список из N самых последних воспроизводимых песен с устройства iOS по порядку.
Единственный способ, которым я могу себе представить, это сделать на данный момент, пройдя все песни через MPMediaQuery
и вручную сортировать их по lastPlayedDate
,
Это потенциально дорогая операция, и мне было интересно, есть ли лучший подход.
Изменить: после некоторых испытаний, это очень дорогая операция. В тестовой библиотеке из 2500 песен потребовалось около 20 секунд, чтобы:
- Получить все песни.
- Назначьте дату всем песням, которые никогда не играли (1 января 1970 года).
- Заказать их по дате.
- Получить первые 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
объект.