在我的应用中,我有一个表格视图,可以显示一个人的活动。我想按天排序数据,然后按名字排序。问题是,由于其他原因,我需要在时间中存储NSDate。
现在,我有这个:
August 18, 2014 11:02 AM Bill B.
August 18, 2014 10:20 AM John D.
August 18, 2014 10:05 AM Adam S.
August 11, 2014 3:47 PM Debbie B.
August 11, 2014 2:13 PM Adam S.
我想要忽略时间,只评估日期。像这样:
August 18, 2014 Adam S.
August 18, 2014 Bill B.
August 18, 2014 John D.
August 11, 2014 Adam S.
August 11, 2014 Debbie B.
是否可以构建一个仅查看月,日和时间的排序描述符?核心数据日期属性的年份?
答案 0 :(得分:5)
我会使用其他属性sortDate
。您可以在对象的startDate
(或者您调用日期属性)的setter中计算该属性。
如果您在核心数据中存储多个对象,这是最快的方法。您可以使用瞬态属性并计算getter中的值,但这会对性能产生很大影响。
我在我的某个应用中使用了类似的内容:
- (void)setStartDate:(NSDate *)startDate {
[self willChangeValueForKey:@"startDate"];
[self setPrimitiveStartDate:startDate];
[self didChangeValueForKey:@"startDate"];
if (startDate) {
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
// might want to save sortDate in UTC
// calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
NSDate *sortDate;
if ([calendar rangeOfUnit:NSDayCalendarUnit startDate:&sortDate interval:NULL forDate:startDate]) {
self.sortDate = sortDate;
}
else {
NSLog(@"Can't create sort date from date %@", startDate);
}
}
else {
self.sortDate = nil;
}
}
然后,fetchRequest将使用sortDate
和startDate
进行排序,并使用sortDate
进行切片。
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"MyEntity"];
NSSortDescriptor *sdSortDate = [NSSortDescriptor sortDescriptorWithKey:@"sortDate" ascending:NO];
NSSortDescriptor *sdStartDate = [NSSortDescriptor sortDescriptorWithKey:@"startDate" ascending:NO];
request.sortDescriptors = @[sdSortDate, sdStartDate];
NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"sortDate" cacheName:@"MyFancyViewControllerCache"];