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]]; 
}]; 
相關問題