[英]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.