iOS coredata排序描述符使用日期的一部分?
Posted
技术标签:
【中文标题】iOS coredata排序描述符使用日期的一部分?【英文标题】:iOS coredata sort descriptor using part of a date? 【发布时间】:2014-08-18 04:30:26 【问题描述】:在我的应用程序中,我有一个表格视图,可以显示一个人随时间的活动。我想按天对数据进行排序,然后按名字排序。问题是,出于其他原因,我需要存储包含时间的 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.
是否可以构造一个仅查看核心数据日期属性的月、日和年的排序描述符?
【问题讨论】:
您需要排序才能进入获取请求,还是可以在获取对象后进行? 【参考方案1】:我会使用一个附加属性sortDate
。您在对象的startDate
(或者您调用日期属性)的设置器中计算该属性。
如果您在核心数据中存储多个对象,这是最快的方法。您可以使用瞬态属性并计算 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"];
【讨论】:
以上是关于iOS coredata排序描述符使用日期的一部分?的主要内容,如果未能解决你的问题,请参考以下文章
NSFetchedResultsController、sectionNameKeyPath 和无数据日期的部分
NSFetchRequest 带有用于递归 CoreData 实体关系的排序描述符