Исключая пунктуацию и префикс «The» в названиях песен при сопоставлении MPMediaQuery - PullRequest
3 голосов
/ 17 марта 2012

Код работает и заполняет таблицу разделами, но у него есть недостаток: он не исключает пунктуацию и префиксы «The» в названиях песен, так же, как это делает нативное музыкальное приложение.очень ценю некоторые советы о том, как мне поступить.

- (void)viewDidLoad
{
    [super viewDidLoad];
    MPMediaQuery *songQuery = [MPMediaQuery songsQuery];
    self.songsArray = [songQuery items];
    self.sectionedSongsArray = [self partitionObjects:self.songsArray collationStringSelector:@selector(title)];
}

- (NSArray *)partitionObjects:(NSArray *)array collationStringSelector:(SEL)selector
{
    UILocalizedIndexedCollation *collation = [UILocalizedIndexedCollation currentCollation];
    NSInteger sectionCount = [[collation sectionTitles] count];
    NSMutableArray *unsortedSections = [NSMutableArray arrayWithCapacity:sectionCount];
    for(int i = 0; i < sectionCount; i++)
    {
        [unsortedSections addObject:[NSMutableArray array]];
    }
    for (id object in array)
    {
        NSInteger index = [collation sectionForObject:object collationStringSelector:selector];
        [[unsortedSections objectAtIndex:index] addObject:object];
    }
    NSMutableArray *sections = [NSMutableArray arrayWithCapacity:sectionCount];
    for (NSMutableArray *section in unsortedSections)
    {
        [sections addObject:[collation sortedArrayFromArray:section collationStringSelector:selector]];
    }
    return sections;
}

Ответы [ 2 ]

5 голосов
/ 06 ноября 2012

Я полностью упустил это. Ответ здесь - просто использовать MPMediaQuerySection. Документы Apple есть по причине!

2 голосов
/ 29 марта 2013

Cocotutch -

Вот реализация, которую я использовал для индексации запроса, содержащего все песни в моей музыкальной библиотеке:

MPMediaQuery *allSongsQuery = [MPMediaQuery songsQuery];

// Fill in the all songs array with all the songs in the user's media library
allSongsArray = [allSongsQuery items];

allSongsArraySections = [allSongsQuery itemSections];

allSongsArraySections - это NSArray для MPMediaQuerySection, каждая из которых имеетназвание и диапазон.Объект NSArray для нулевого раздела (с заголовком @ "A" в моем случае) имеет range.location 0 и range.length 158.

Я возвращаю значение range.length для каждого раздела, когда вызывается numberOfRowsInSectionдля моего UITableView.Я использую значение range.location в cellForRowAtIndexPath в качестве начальной строки раздела, а затем добавляю к нему indexPath.row, чтобы получить ячейку, которую мне нужно вернуть из моего allSongsArray.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
....
    // Return the number of rows in the section.
    MPMediaQuerySection *allSongsArraySection = globalMusicPlayerPtr.allSongsArraySections[section];
    return allSongsArraySection.range.length;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
...
    MPMediaQuerySection *allSongsArraySection = globalMusicPlayerPtr.allSongsArraySections[indexPath.section];
    rowItem = [globalMusicPlayerPtr.allSongsArray objectAtIndex:allSongsArraySection.range.location + indexPath.row];
....
}

Прежде чем использовать это, я попытался сопоставить реализацию родного музыкального плеера, написав свою собственную, и она не вела себя достаточно идентично.Не только это, но и собственная индексация НАМНОГО быстрее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...