使用部分日期的iOS coredata排序描述符?

时间:2014-08-18 04:30:27

标签: ios sorting core-data nssortdescriptor

在我的应用中,我有一个表格视图,可以显示一个人的活动。我想按天排序数据,然后按名字排序。问题是,由于其他原因,我需要在时间中存储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 个答案:

答案 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将使用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"];