我有一个NSMutableArray,它包含两种类型的对象。
两个对象都包含一个具有不同名称的日期字段(具有不同格式的日期字符串)。
根据日期排序所有内容的最佳和最快方法是什么?在这种情况下是否可以使用NSSortDescriptor
?
答案 0 :(得分:4)
如果您的目标是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 :(得分:1)
您可以添加类别以统一日期字段名称。假设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 ] ] ] ;