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 将使用 sortDatestartDate 进行排序,使用 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排序描述符使用日期的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

Swift Core Data 两个排序描述符

使用 Core Data 时如何重新排列部分

NSFetchedResultsController、sectionNameKeyPath 和无数据日期的部分

NSFetchRequest 带有用于递归 CoreData 实体关系的排序描述符

使用 NSDate 的核心数据排序描述符,使用 Swift 的 iOS

如何为此 SwiftUI CoreData 模型正确插入排序描述符?