Подтвердить что ты не робот

Сортировка NSArray пользовательских объектов по их свойствам NSDate

Я пытаюсь сортировать NSArray, который заполняется пользовательскими объектами. Каждый объект имеет свойство startDateTime, которое имеет тип NSDate.

Следующий код приводит к массиву sortedEventArray, заполненному, но не отсортированному. Я иду об этом совершенно неправильно или я просто пропустил что-то маленькое?

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

Ответ 1

Вы уверены, что переменные экземпляра startDateTime событий node не равны нулю?

Если у вас его еще нет, вы можете добавить () метод -description к объектам событий node, который сделает что-то вроде этого:

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

Затем в вашем журнале сортировки укажите массив до и после:

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

Если startDateTime все nil, массивы до и после будут иметь одинаковый порядок (так как операция сортировки будет равна отправке всех сообщений -compare: на nil, что в основном ничего не делает).

Ответ 2

Хорошо, я знаю, что это немного поздно, но вот как я это сделаю:

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

Очевидно, замените событие классом вашего пользовательского объекта. Преимущество такого подхода заключается в том, что вы защищены от будущего рефакторинга. Если вы должны были реорганизовать и переименовать свойство startDateTime на что-то еще, Xcode, вероятно, не изменит строку, которую вы передаете в дескриптор сортировки. Внезапно ваш код сортировки сломается/ничего не сделает.

Ответ 3

Вы пытались указать компаратор NSDate?

Например:

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

Это должно обеспечить использование правильного компаратора класса NSDate.

Ответ 4

Вы можете достичь этого, как это,

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:FALSE];

[self.Array sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

Ответ 5

Вы можете добиться этого,

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"anyDateField"  ascending:YES];

NSMutableArray *arr = [[array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]mutableCopy];