2015-05-27 64 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]; 
    }];