2015-05-27 40 views
-1

我有以下的NSArray它包含每个索引处的字典,这里是内容,只是提供第一3以下纪录排序的NSArray含有字典的阵列 - 排序按“日期”键

[ 
      { 

       "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”键对数组进行排序,意味着整个数组将按日期排序(升序/降序)。

我用下面的代码,但没有帮助的arrarrEventsData存储的所有数据,但排序没有发生的事情: -

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

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

任何想法或解决方案将帮助。

感谢

+0

这些都不是日期,他们是字符串。 – Droppy

+0

是的,它们是字符串。我无法更改它,因为它来自后端。 – Vizllx

+0

你不能改变它? – Droppy

回答

2
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); 
2

像这样:

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” 的方法,但是要实现的是,看到另一个苏答案在这里:Convert NSString of a date to an NSDate

编辑:@Droppy有指出,只要数据从服务器到达,最好将字符串解析为NSDate。这可以防止在排序中进行昂贵的重复转换,并且无论如何都可能更有用。

+0

我敢肯定,这将工作,但重复的字符串转换到日期将使它昂贵。 – Droppy

+0

(更重要的是,如果您按照您链接的代码并每次创建一个新的'NSDateFormatter')。 – Droppy

+0

当然。但是这取决于你有多少记录,不管是否会导致问题。如果确实如此,有很多方法可以缓存转换。不要为他做这件事;) – n13

0

您必须创建这些NSStringNSDate对象,使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]; 
    }];