Сортировать NSmutableArray, который содержит 2 типа объектов? - PullRequest
5 голосов
/ 18 августа 2011

У меня есть NSMutableArray, который содержит 2 типа объектов.

Оба объекта содержат поле для дат (строки даты в разных форматах) с разными именами.

Какой самый лучший и быстрый способ отсортировать их по дате? Можно ли использовать NSSortDescriptor в этой ситуации?

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

Если вы нацелены на Mac OS X v10.6 или iOS4 и выше, вы можете сортировать с помощью компаратора, подобного этому

NSDateFormatter *formatter1 = ...; //create and configure date formatter for Class1
NSDateFormatter *formatter2 = ...; //create and configure date formatter for Class2


[arrayOfObjects sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSDate *date1 = nil, *date2 = nil;
    //Get first objects date
    if([obj1 isKindOfClass:[Class1 class]])
    {
        date1 = [formatter1 dateFromString:[obj1 class1Date]];
    }
    else if([obj1 isKindOfClass:[Class2 class]])
    {
        date1 = [formatter2 dateFromString:[obj1 class2Date]];
    }

    //Get second objects date
    if([obj2 isKindOfClass:[Class1 class]])
    {
        date2 = [formatter1 dateFromString:[obj2 class1Date]];
    }
    else if([obj2 isKindOfClass:[Class2 class]])
    {
        date2 = [formatter2 dateFromString:[obj2 class2Date]];
    }

    NSAssert(date1 != nil, @"Could not parse date from %@", obj1);
    NSAssert(date2 != nil, @"Could not parse date from %@", obj2);

    return [date1 compare:date2];
}];

Помимо проверки класса, вы также можете проверить, отвечает ли он на селектор.

1 голос
/ 29 августа 2012

Вы можете добавить категорию, чтобы объединить имя поля даты. Допустим, у экземпляров класса A есть поле «dateString», а у экземпляров класса B - «creationDateString» ...

@implementation A (SortByDate)

-(NSDate*)sortDate
{
    static NSDateFormatter * formatter = nil ;
    static dispatch_once_t once = 0 ;
    dispatch_once( & once, ^{ formatter = ... } ) ;

    return [ formatter dateFromString:self.dateString ] ;
}
@end

@implementation B (SortByDate)
-(NSDate*)sortDate
{
    static NSDateFormatter * formatter = nil ;
    static dispatch_once_t once = 0 ;
    dispatch_once( & once, ^{ formatter = ... } ) ;

    return [ formatter dateFromString:self.creationDateString ] ;
}
@end

Теперь вы можете сортировать все объекты в вашем массиве по их sortDate свойству:

NSArray * sortedByDateArray = [ unsortedArray sortedArrayUsingComparator:^( id a, id b ){
    return [ [ a sortDate ] compare:[ b sortDate ] ] ;
}];

РЕДАКТИРОВАТЬ Или с дескриптором сортировки:

NSArray * sortedArray = [ unsortedArray sortedArrayUsingDescriptors:[ NSArray arrayWithObject:[ NSSortDescriptor sortDescriptorWithKey:@"sortDate" ascending:YES ] ] ] ;
...