Tengo un campo lleno de identificadores de un tercero. Los ids son números pero escritos en el db como una cadena.NSSortDescriptor ordenar un campo de cadena como un número con el bloque de comparación no funciona
Quiero ordenar una búsqueda ordenada por esta identificación en el valor del número entero. Así que estoy agregando este NSSortDescriptor
al NSFetchRequest
.
NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init];
[numFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSSortDescriptor *sortBy = [[NSSortDescriptor alloc] initWithKey:@"someId" ascending:YES comparator:^(id a, id b) {
return [[numFormatter numberFromString:a] compare:[numFormatter numberFromString:b]];
}];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortBy]];
Pero obtengo resultados como el siguiente. Estos todavía están ordenados alfabéticamente como una cadena.
730275292
73900038
730172867
7350727
830138437
835164
837287901
8338804
930274
9324376
¿Qué no entiendo sobre el uso de este bloque de comparación?
EDIT 1 de mayo de 2012 09:20 am EST
Para probar si el bloque comparador está siendo utilizado, He intentado lo siguiente para ordenar en base a la longitud del campo.
NSSortDescriptor *sortBy = [[NSSortDescriptor alloc] initWithKey:@"fbId" ascending:YES comparator:^(id a, id b) {
if ([a length] < [b length]) {
return NSOrderedAscending;
} else if ([a length] > [b length]) {
return NSOrderedDescending;
} else {
return NSOrderedSame;
}
}];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortBy]];
¡Todavía estoy obteniendo resultados ordenados alfabéticamente! Entonces, esto me hace pensar que el bloque comparador ni siquiera se está utilizando.
716164250
726354466
73900038
739600038
7450727
810138437
801164
801375346
8213997
¿Qué devuelve numFormatter? ¿En t? ¿Cuerda? –
NSNumberFormatter * numFormatter = [[NSNumberFormatter alloc] init]; [numFormatter setNumberStyle: NSNumberFormatterDecimalStyle]; –
¿Ha intentado establecer un punto de interrupción en el bloque de comparación para ver si se está llamando? Si se está llamando, entonces puedes estar seguro de que es el código de bloque el que está mal. –