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]];