Ordenar NSArray de objects personalizados por suas propriedades NSDate

Eu estou tentando classificar um NSArray que é preenchido com objects personalizados. Cada object tem uma propriedade startDateTime que é do tipo NSDate.

O código a seguir resulta em uma matriz, sortedEventArray , preenchida, mas não classificada. Eu estou indo sobre isso completamente errado ou estou apenas sentindo falta de algo pequeno?

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

Tem certeza de que as variables ​​de instância startDateTime dos events do nó não são nulas?

Se você não tiver um, você pode adicionar um método de -description (custom) aos objects de evento do nó que faz algo assim:

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

Em seguida, no seu código de sorting, registre a matriz antes e depois:

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

Se os startDateTime forem todos nil , então os arrays before e after terão a mesma ordem (já que a operação de ordenação será equivalente a enviar todas as mensagens -compare: nil , o que basicamente não faz nada).

Você tentou especificar o comparador NSDate ?

Por exemplo:

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

Isso deve impor o uso do comparador correto da class NSDate .

Ok, eu sei que é um pouco tarde, mas é assim que eu faria:

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

Obviamente, substitua Event pela class do seu object personalizado. A vantagem dessa abordagem é que você está protegido contra refatoração futura. Se você fosse refatorar e renomear a propriedade startDateTime para outra coisa, o Xcode provavelmente não mudaria a string que você está passando para o descritor de sorting. De repente, seu código de sorting quebraria / não faria nada.

Você pode conseguir assim,

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

Você pode conseguir isso assim,

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