2011-08-19 52 views
3

我对以下任务有困难:我有一个NSMutableArray,其中包含NSManagedObjects“OpeningHours”,这是我从核心数据中提取的。Objective-C:按工作日对NSMates的NSMutableArray进行排序

NSMutableArray *openingHoursArray = [NSMutableArray arrayWithArray: [[museum valueForKey:@"openingHours"] allObjects]]; 

该数组是未排序的,如让从我的NSManagedObject的“博物馆”返回随机组织组键的值。

数组中的NSManagedObjects“openingHours”的值类型为NSDate,可通过键“start”和“end”访问。现在,为了显示我的方式是有道理的开放时间,我访问相应日期的星期和时间信息,到目前为止使用这段代码工作正常:

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:mainDelegate.localeCode]; 

NSDateFormatter *weekday = [[[NSDateFormatter alloc] init] autorelease]; 
[weekday setLocale:locale]; 
[weekday setDateFormat: @"EEEE"]; 

[NSDateFormatter *time = [[[NSDateFormatter alloc] init] autorelease]; 
[time setLocale:locale]; 
[time setTimeStyle:NSDateFormatterShortStyle]; 

for (NSManagedObject *openingHour in openingHoursArray) { 

     NSLog(@"%@", [openingHour valueForKey:@"start"]); 
     NSDate *startDate = [openingHour valueForKey:@"start"]; 
     NSDate *endDate = [openingHour valueForKey:@"end"]; 


     NSString *startDay = [weekday stringFromDate:startDate]; 
     NSString *endDay = [weekday stringFromDate:endDate]; 
     NSString *startTime = [time stringFromDate:startDate]; 
     NSString *endTime = [time stringFromDate:endDate]; 


     if (![startDay isEqualToString:endDay]) { 
      [openingHoursString appendFormat:@"%@ - %@:\t%@ - %@ \n", startDay, endDay, startTime, endTime];   
     } 
     else { 
      [openingHoursString appendFormat:@"%@:\t%@ - %@ \n", startDay, startTime, endTime];    
     } 

    } 

这给了我所需要的输出:

周四:10:00 AM - 9:00 PM

周五 - 周日:上午10点 - 下午6:00

周一 - 周五:10:00 AM - 5:00 PM

现在的问题是:我当然想要首先显示星期一的开放时间。我需要在开始日期值的工作日排序我的数组。我试着用下面的排序是:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"start" ascending:TRUE]; 
[openingHoursArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

但显然,这并不工作,因为它只是通过排序日期和1970-01-01不幸星期四,因此周四将我的数组的第一个项目按上述代码排序。

有没有人有如何“解决这个问题”的好主意? :-)我完全被困在这.. 非常感谢!

+0

这可能是更好的只是2天转移,而不是执行日期排序开始日期,或者你有更多的理由要求日期优先? –

+0

这是一个想法,但我不知道我需要转多少天,因为开放时间可能会有所不同 - 每天可能会有个人开放时间,或者覆盖更长的时间,比如“mon-sat”,或基本上其他任何..我需要一个解决方案,将开放时间的任何组合工作,总是首先显示星期一(如果星期一是开放日)..有点棘手我猜! – Julia

回答

-1

不使用NSSortDescriptor,而是使用NSArray的sortedArrayUsingSelector或NSMutableArray的sortUsingSelector方法,并传入@selector(compare:)作为选择器。

看到这个答案的详细信息:Click

2

像这样的东西应该工作:

NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 
NSArray *sortedArray = [openingHoursArray sortedArrayUsingComparator: ^(id obj1, id obj2) { 
    NSDate *startDate1 = [obj1 valueForKey:@"start"]; 
    NSDate *startDate2 = [obj2 valueForKey:@"start"]; 
    NSDateComponents *components1 = [calendar components:NSWeekdayCalendarUnit fromDate:startDate1]; 
    NSDateComponents *components2 = [calendar components:NSWeekdayCalendarUnit fromDate:startDate2]; 
    NSInteger weekday1 = [components1 weekday]; 
    if (weekday1 == 1) weekday1 = 8; //Order sundays last 
    NSInteger weekday2 = [components2 weekday]; 
    if (weekday2 == 1) weekday2 = 8; 
    return [[NSNumber numberWithInteger:weekday1] compare:[NSNumber numberWithInteger:weekday2]]; 
}]; 
相关问题