[英]Sorting NSArray which contain array of dictionaries - Sort as per “Date” key
我有以下NSArray,每个索引包含一个字典,这是内容,仅提供前3条记录-
[
{
"postDate": "4/11/2011 2:03:33 PM",
"imageLink": "",
"eventLink": "www.google.com"
},
{
"postDate": "6/16/2011 1:42:45 PM",
"imageLink": "",
"eventLink": "www.google.com"
},
{
"postDate": "9/21/2011 10:22:34 AM",
"imageLink": "",
"eventLink": "www.google.com"
}
]
注意: postDate
只是一个NSString,它不是NSDate类型的,但是我必须基于此键执行排序。
我的任务是按照“ postDate”键对数组进行排序 ,这意味着整个数组将按日期 (升序/降序)进行排序 。
我使用了下面的代码,但是没有帮助,因为arr
从arrEventsData
存储了所有数据,但是排序没有发生:-
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"postDate" ascending:YES];
NSMutableArray *arr = [[arrEventsData sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]mutableCopy];
任何想法或解决方案都将有所帮助。
谢谢
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"M/dd/yyyy H:mm:ss a"];
NSArray *sortedByDates = [arr sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2)
{
NSDate *date1 = [dateFormatter dateFromString:obj1[@"postDate"]];
NSDate *date2 = [dateFormatter dateFromString:obj2[@"postDate"]];
return [date1 compare:date2];
}];
NSLog(@"Sorted Array : %@",sortedByDates);
像这样:
NSMutableArray *sortedArray = [arr sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) {
NSDate *d1 = [self stringToDate:obj1[@"postDate"]];
NSDate *d2 = [self stringToDate:obj2[@"postDate"]];
return [d1 compare:d2];
}];
对于“ stringToDate”方法,但是您要实现该方法,请参见此处的另一个SO答案: 将日期的NSString转换为NSDate
编辑:正如@Droppy所指出的,一旦数据从服务器到达,最好将字符串解析为NSDate。 这样可以避免在分类中进行昂贵的重复转换,并且无论如何可能更有用。
您将必须从这些NSString
创建NSDate
对象以使compare
工作
创建静态NSDateFormatter,因为创建起来很昂贵:
NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *a, NSDictionary *b) {
static NSDateFormatter *dateFormatter = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //Set correct format here
});
NSDate *first = [dateFormatter dateFromString:[a objectForKey:@"postDate"]];
NSDate *second = [dateFormatter dateFromString:[b objectForKey:@"postDate"]];
return [first compare:second];
}];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.