Tengo un Array (NSMutableArray) de objetos y quiero ordenarlo según algún campo de un objeto. (Por ejemplo, el order by de la base de datos
no funciona correctamente para palabras con acentuación).
Lo que hay que hacer es crear un comparador personalizado en la clase del objeto de la siguiente manera:
Ordeno por nombre. En este caso, la ordenación debe funcionar para palabras acentuadas, por eso se hace la conversión a ASCII.
- (NSComparisonResult)orderFunction:(Object *)otherObject {
NSData *myStringData = [self.name dataUsingEncoding: NSASCIIStringEncoding allowLossyConversion: YES];
NSData *otherStringData = [otherObject.name dataUsingEncoding: NSASCIIStringEncoding allowLossyConversion: YES];
NSString *myString = [[[NSString alloc] initWithData: myStringData encoding: NSASCIIStringEncoding] autorelease];
NSString *otherString = [[[NSString alloc] initWithData: otherStringData encoding: NSASCIIStringEncoding] autorelease];
return [myString compare:otherString];
}
o mucho más corto y eficiente:
- (NSComparisonResult)orderFunction:(Object *)otherObject {
return [self.name localizedCompare:otherObject.name];
}
Para ordenar tu NSMutableArray debes hacer:
NSArray *sortedArray = [mArr sortedArrayUsingSelector:@selector(orderFunction:)];