La conveniencia constructor artistsQuery
no ordenar y agrupar por álbum. artistsQuery
devuelve una colección de colecciones de elementos multimedia de todos los artistas ordenados alfabéticamente por nombre de artista. Anidado dentro de cada colección de artistas hay una serie de elementos multimedia asociados con todas las canciones para ese artista. La matriz anidada se ordena alfabéticamente por título de la canción.
Una forma de mantener un recuento de álbumes por artista es enumerar a través de todos los elementos de la canción para cada colección de artistas y utilizar un NSMutableSet
para realizar un seguimiento de títulos de álbumes distintos asociados con cada canción. A continuación, agregue el recuento del conjunto como el valor para cada clave de artista en un NSMutableDictionary
. Cualquier títulos de los álbumes duplicados no se añadirán desde un NSMutableSet
solamente se llevará a objetos distintos:
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);
Sería más limpia si cambia la consulta a albumsQuery
. Esta consulta agrupa y ordena la colección por nombre de álbum. A continuación, solo se trata de enumerar a través de la matriz de colecciones de álbumes y llevar un recuento del nombre del artista representativo de cada álbum en un NSCountedSet
. El conjunto contado rastreará se inserta el número de veces que los objetos:
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);
También puede recuperar el recuento de un objeto dado en un NSCountedSet
con el método countForObject:
.
¡¡¡Funciona perfectamente !! Muchas gracias !! – Jonathan