Skip to content

Instantly share code, notes, and snippets.

@Nub
Created June 14, 2013 00:13
Show Gist options
  • Save Nub/5778494 to your computer and use it in GitHub Desktop.
Save Nub/5778494 to your computer and use it in GitHub Desktop.
Handy tool for sorting/grouping an array of items with dates into various calendar based groupings.
+ (NSArray*)eventsGroupedByDay:(NSArray*)events {
return [HistoryManager events:events groupedByDateComponents:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit)];
}
+ (NSArray*)eventsGroupedByWeek:(NSArray*)events {
return [HistoryManager events:events groupedByDateComponents:(NSWeekCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit)];
}
+ (NSArray*)events:(NSArray*)events groupedByDateComponents:(NSUInteger)dateComponents {
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSMutableDictionary *groups = [NSMutableDictionary dictionary];
NSDictionary *currentGroup;
NSMutableArray *currentGroupEvents;
for (Event* event in events) {
NSDateComponents *components = [gregorian components:dateComponents
fromDate:event.date];
NSDate *key = [gregorian dateFromComponents:components];
currentGroup = groups[key];
//If day doesn't exist, add new group
if (!currentGroup) {
currentGroupEvents = [NSMutableArray array];
currentGroup = [@{ @"date":key,
@"events":currentGroupEvents} mutableCopy];
[groups setObject:currentGroup forKey:key];
}
else {
currentGroupEvents = currentGroup[@"events"];
}
//Add object to group
[currentGroupEvents addObject:event];
}
NSArray *sortedKeys = [[NSArray arrayWithArray:[groups allKeys]] sortedArrayUsingSelector:@selector(compare:)];
NSMutableArray *groupsArray = [NSMutableArray array];
for (NSDate* groupKey in sortedKeys) {
[groupsArray addObject:groups[groupKey]];
}
return groupsArray;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment