Ordenar NSArray con objects personalizados

En mi proyecto Xcode tengo las siguientes classs:

Dirección

@interface LDAddress : NSObject{ NSString *street; NSString *zip; NSString *city; float latitude; float longitude; } @property (nonatomic, retain) NSString *street; @property (nonatomic, retain) NSString *zip; @property (nonatomic, retain) NSString *city; @property (readwrite, assign, nonatomic) float latitude; @property (readwrite, assign, nonatomic) float longitude; @end 

Ubicación

 @interface LDLocation : NSObject{ int locationId; NSString *name; LDAddress *address; } @property (readwrite, assign, nonatomic) int locationId; @property (nonatomic, retain) LDAddress *address; @property (nonatomic, retain) NSString *name; @end 

En una subclass de UITableViewController, hay un NSArray que contiene una gran cantidad de objects no clasificados de LDLocations. Ahora, quiero clasificar los objects ascendentes de NSArray en function de la ciudad de propiedad de un LDAddress.

¿Cómo puedo orderar la matriz usando NSSortDescriptor? Intenté lo siguiente, pero la aplicación vuelca al orderar la matriz.

 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Address.city" ascending:YES]; [_locations sortedArrayUsingDescriptors:@[sortDescriptor]]; 

Intente hacer la primera key minúscula.

 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"address.city" ascending:YES]; 

También puede orderar una matriz con bloques:

  NSArray *sortedLocations = [_locations sortedArrayUsingComparator: ^(LDAddress *a1, LDAddress *a2) { return [a1.city compare:a2.city]; }]; 

Esto permitirá orderar con múltiples types. Al igual que tenemos que orderar la película en function del time y, si el time es igual, debemos orderar por nombre.

 NSArray *sortedArray = [childrenArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { NSNumber *first = [NSNumber numberWithLong:[(Movie*)a timeInMillis]]; NSNumber *second = [NSNumber numberWithLong:[(Movie*)b timeInMillis]]; NSComparisonResult result = [first compare:second]; if(result == NSOrdenetworkingSame){ result = [((NSString*)[(Movie*)a name] ) compare:((NSString*)[(Movie*)b name])]; } return result; }]; 
 -(NSArray*)sortedWidgetList:(NSArray*)widgetList { NSSortDescriptor *firstDescriptor = [[NSSortDescriptor alloc] initWithKey:@"itemNum" ascending:YES]; NSArray *sortDescriptors = [NSArray arrayWithObjects:firstDescriptor, nil]; NSArray *sortedArray = [widgetList sortedArrayUsingDescriptors:sortDescriptors]; return sortedArray; }