Основные данные сортируются по дате с помощью FetchedResultsController по разделам


В настоящее время у меня есть класс, в котором есть объект date. Этот объект даты имеет в себе как время, так и день. Вся эта информация загружается в UITableViewCell через NSFetchedResultsController. Мне нужно отсортировать даты по разделам, где каждый раздел-это дата Без времени. Мне также нужно, чтобы каждый раздел был отсортирован по времени. Вот как выглядит мой текущий _fetchedResultsController:

[self.managedObjectContext lock];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"Entity" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                          initWithKey:@"due" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil
                                               cacheName:@"Root"];
theFetchedResultsController.delegate = sender;
[self.managedObjectContext unlock];
return theFetchedResultsController;

Атрибут, который мне нужно отсортировать, - это атрибут Entity.due.

1 6

1 ответ:

Вы можете проверить образец основных данных под названием "DateSectionTitles" для более глубокого понимания, я выделяю основы из него.

Чтобы иметь разделы по дате, необходимо сначала отсортировать их по нормализованной (или упрощенной) дате. Попробуйте следующее:

Добавьте переходный атрибут к своей сущности в Редакторе основных моделей данных. Убедитесь, что его тип-NSDate, а свойство transient проверено. Обновите файлы класса NSManagedObject, добавив свойство как strong НСДАП. Назовем это "упрощенной датой". Также добавьте еще одно свойство к вашему .H файл, назовем его "primitiveSimplifiedDate". Сделайте его сильным.

В .m используйте @dynamic как для simplifiedDate, так и для primitiveSimplifiedDate. Этот переходный атрибут должен использовать функцию return an NSDate, которая была нормализована до полуночи. Этот уровень устанавливает все и позволяет устанавливать секции. Я использовал код примерно так:

-(NSDate *)simplifiedDate{
     // Create and cache the section identifier on demand.

    [self willAccessValueForKey:@"simplifiedDate"];
    NSDate *tmp = [self primitiveSimplifiedDate];
    [self didAccessValueForKey:@"simplifiedDate"];

    if (!tmp) {
        tmp=[self simplifiedDateForDate: [self due]];
        [self setPrimitiveSimplifiedDate: tmp];
    }

    return tmp;
}


-(NSDate *)simplifiedDateForDate:(NSDate *)date {

    if (!date) {
        return nil;
    }

    static NSCalendar *gregorian = nil;

    gregorian=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *newDateComponents=[gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit| NSDayCalendarUnit) fromDate:date];

    return [gregorian dateFromComponents:newDateComponents];
 }

Если вы так хотите, это также может быть фактическим атрибут, который вычисляется и сохраняется при установке фактической даты.

Далее у вас будет два дескриптора сортировки. Первым дескриптором сортировки будет указанный выше переходный атрибут "simplifiedDate". Вторым атрибутом будет атрибут" due". "SimplifiedDate", если NSFetchedResultsController настроен правильно на следующем шаге, будет сортировать все в соответствии с разделом.

Наконец, вам нужно указать имя ключа секции, когда вы выделяете / вводите NSFetchedResultsController. В этом случае он будет "упрощен". Вот так:

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"simplifiedDate"cacheName:@"Root"];

Надеюсь, это поможет.

T