Tengo un grupo de artistas almacenados en CoreData y quiero ordenarlos por nombre pero ignorando el prefijo "el". Entonces, por ejemplo, "The Beatles" se clasificaría como "Beatles", como lo que hace iTunes/iPod.NSSortDescriptor para quitar el "prefijo"
así que traté de añadir una propiedad personalizada cleanName
a mi modelo del artista para que pueda ser utilizado para la clasificación con:
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"cleanName" ascending:YES];
Eso, obviamente, hace bajar la aplicación como cleanName
no es una propiedad de la SQLEntity:
...keypath cleanName not found in entity <NSSQLEntity Artist id=1>
Sé que podría guardar el cleanName en la tienda, pero me parece incorrecto. ¿Un nuevo atributo para tener el nombre despojado del prefijo "the"? De Verdad?
Así que en vez, me trataron como subclase NSSortDescriptor con un compareObject personalizado: toObject: aplicación:
- (NSComparisonResult)compareObject:(Artist*)artist1 toObject:(Artist*)artist2 {
NSString *cleanString1 = [artist1.name stringByReplacingOccurrencesOfString:@"the " withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [artist1.name length])];
NSString *cleanString2 = [artist2.name stringByReplacingOccurrencesOfString:@"the " withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [artist2.name length])];
return [artist1.cleanName compare:artist2.cleanName options:NSCaseInsensitiveSearch];
}
Esto funciona cuando agrego un nuevo artista, por ejemplo "The Beatles" a mi tienda. El artista está clasificado como "Beatles" y se muestra dentro de mi sección "B". Pero tan pronto como sale de la aplicación y relanzarlo, me sale el siguiente error y el tableview sólo se queda vacío:
sectionIndex A for Apparat
sectionIndex B for Bonobo
sectionIndex M for Misteur Valaire
sectionIndex M for Moderat
sectionIndex P for Paul Kalkbrenner
sectionIndex R for Röyksopp
sectionIndex B for The Beatles
NSFetchedResultsController ERROR: The fetched object at index 6 has an out of order section name 'R. Objects must be sorted by section name'
Como se puede ver en lo que estoy registro, los títulos de las secciones están bien (The Beatles 'título de la sección es B, como debería ser). Pero la clasificación está rota, ya que este registro debería estar justo antes de "Bonobo".
¿Alguna idea de cómo solucionar esto?
¿Cómo implementó * cleanName *? Parecería una propiedad transitoria para la entidad sería el camino a seguir. – Huperniketes
Estoy bastante seguro de que las propiedades transitorias no se pueden usar para ordenar en NSFetchedResultsControllers. – samvermette