Основные данные сортируются по дате с помощью 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 ответ:
Вы можете проверить образец основных данных под названием "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