artistsQuery
удобства конструктор не сортировать и группы по альбому. artistsQuery
возвращает массив коллекций элементов мультимедиа всех художников, отсортированных по алфавиту по имени исполнителя. Вложенная внутри каждой коллекции художник представляет собой массив элементов мультимедиа, связанных со всеми песнями для этого исполнителя. Вложенный массив сортируется по алфавиту по названию песни.
Один из способов сохранить количество альбомов от исполнителя - перечислить все композиции для каждой коллекции исполнителей и использовать NSMutableSet
, чтобы отслеживать отдельные названия альбомов, связанные с каждой песней. Затем добавьте счетчик набора как значение для каждого исполнительского ключа в NSMutableDictionary
. Любые дублирующие названия альбома не будут добавлены так как NSMutableSet
будет принимать только отдельные объекты:
MPMediaQuery *artistQuery = [MPMediaQuery artistsQuery];
NSArray *songsByArtist = [artistQuery collections];
NSMutableDictionary *artistDictionary = [NSMutableDictionary dictionary];
NSMutableSet *tempSet = [NSMutableSet set];
[songsByArtist enumerateObjectsUsingBlock:^(MPMediaItemCollection *artistCollection, NSUInteger idx, BOOL *stop) {
NSString *artistName = [[artistCollection representativeItem] valueForProperty:MPMediaItemPropertyArtist];
[[artistCollection items] enumerateObjectsUsingBlock:^(MPMediaItem *songItem, NSUInteger idx, BOOL *stop) {
NSString *albumName = [songItem valueForProperty:MPMediaItemPropertyAlbumTitle];
[tempSet addObject:albumName];
}];
[artistDictionary setValue:[NSNumber numberWithUnsignedInteger:[tempSet count]]
forKey:artistName];
[tempSet removeAllObjects];
}];
NSLog(@"Artist Album Count Dictionary: %@", artistDictionary);
Было бы чище, если вы измените запрос albumsQuery
. Этот запрос группирует и сортирует коллекцию по названию альбома. Тогда это просто вопрос перечисления в массиве коллекций альбомов и подсчет имени представителя художника для каждого альбома в NSCountedSet
. Подсчитывали набор будет отслеживать количество раз объектов вставляются:
MPMediaQuery *albumQuery = [MPMediaQuery albumsQuery];
NSArray *albumCollection = [albumQuery collections];
NSCountedSet *artistAlbumCounter = [NSCountedSet set];
[albumCollection enumerateObjectsUsingBlock:^(MPMediaItemCollection *album, NSUInteger idx, BOOL *stop) {
NSString *artistName = [[album representativeItem] valueForProperty:MPMediaItemPropertyArtist];
[artistAlbumCounter addObject:artistName];
}];
NSLog(@"Artist Album Counted Set: %@", artistAlbumCounter);
Можно также получить счетчик для данного объекта в NSCountedSet
с методом countForObject:
.
Это работа отлично !! Большое спасибо !! – Jonathan