Ordenar NSArray de objetos personalizados por sus propiedades NSDate

Estoy intentando ordenar un NSArray que está lleno de objetos personalizados. Cada objeto tiene una propiedad startDateTime que es de tipo NSDate.

El siguiente código da como resultado una matriz, sortedEventArray , poblada pero no ordenada. ¿Voy por esto de una manera completamente equivocada o me estoy perdiendo algo pequeño?

 NSSortDescriptor *dateDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"startDateTime" ascending:YES]; NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor]; NSArray *sortedEventArray = [nodeEventArray sortedArrayUsingDescriptors:sortDescriptors]; 

¿Estás seguro de que las variables de instancia startDateTime de los eventos del nodo son no-nil?

Si aún no tiene uno, puede agregar un método de -description (personalizado) a los objetos de su evento de nodo que haga algo como esto:

 - (NSString *)description { return [NSString stringWithFormat:@"%@ - %@", [super description], startDateTime]]; } 

Luego, en su código de clasificación, registre la matriz antes y después:

 NSLog(@"nodeEventArray == %@", nodeEventArray); NSSortDescriptor *dateDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"startDateTime" ascending:YES]; NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor]; NSArray *sortedEventArray = [nodeEventArray sortedArrayUsingDescriptors:sortDescriptors]; NSLog(@"sortedEventArray == %@", sortedEventArray); 

Si los startDateTime son todos nil , las matrices antes y después tendrán el mismo orden (ya que la operación de clasificación equivaldrá a enviar todos los -compare: messages a nil , que básicamente no hace nada).

¿ NSDate especificando el comparador NSDate ?

P.ej:

 NSSortDescriptor *dateDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"startDateTime" ascending:YES selector:@selector(compare:)]; 

Esto debería hacer cumplir el uso del comparador correcto de la clase NSDate .

Ok, sé que esto es un poco tarde, pero así es como lo haría:

 NSArray *sortedEventArray = [events sortedArrayUsingComparator:^NSComparisonResult(Event *event1, Event *event2) { return [event1.startDateTime compare:event2.startDateTime]; }]; 

Obviamente, reemplace Evento con la clase de su objeto personalizado. La ventaja de este enfoque es que está protegido contra futuras refactorizaciones. Si fuera a refactorizar y renombrar la propiedad startDateTime a otra cosa, Xcode probablemente no cambiaría la cadena que está pasando al descriptor de clasificación. De repente, tu código de clasificación se rompería / no haría nada.

Puedes lograr así,

 NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"anyDateField" ascending:YES]; NSMutableArray *arr = [[array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]mutableCopy]; 

Puedes lograr esto así,

 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:FALSE]; [self.Array sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];