2014-02-10 2 views
2

У меня есть небольшая проблема с сортировкой моего NSFetchedResultsController.CoreData NSFetchedResultsController Сортировка

My NSManagedObject имеет два атрибута. date и startTime.

date это время 00:00:00 на все мои объектах, таким образом, при использовании date как sectionNameKeyPath она захватывает все объекты с одинаковыми датами (днем) в одной секции. Если время дат было иным, оно помещало бы каждый объект в другой раздел.

Это хорошо работает, но затем внутри каждой группы я хочу сортировать объекты по startTime. Таким образом, они представляют собой список с самого раннего момента на этом date до последнего в каждом разделе соответственно.

Моя проблема заключается в использовании date как sectionNameKeyPath и startTime как NSSortDescriptor` ему не нравится и играет странно. Например, только иногда показывающие определенные данные в том, что кажется нерегулярным.

Я думаю, что это сводится к тому, чтобы иметь дескриптор сортировки и sectionNameKeyPath то же самое. Я прав, думая об этом? Если нет, как мне настроить мой NSFetchedResultsController, чтобы перечислить мои данные в упомянутой моде?

Спасибо.

EDIT: вот код. Также стоит отметить, что при использовании startTime в качестве моего второго дескриптора сортировки он вызывает отображение дубликатов в моем представлении таблицы с объектами nil.

NSFetchedResultsController:

NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES]; 
    NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"startTime" ascending:YES]; 
    NSArray *sortDescriptors = @[sortDescriptor1, sortDescriptor2]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"date" cacheName:@"Master"]; 

cellForRowAtIndexPath только отрывок, показывающий, как я обозначаю каждый управляемый объект:

id <NSFetchedResultsSectionInfo> sectionInfo = [self.flightFetchedResultsController.sections objectAtIndex:indexPath.section]; 
    NSArray *sectionFlights = [sectionInfo objects]; 
    Flight *flight = [sectionFlights objectAtIndex:indexPath.row]; 

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return self.flightFetchedResultsController.sections.count; 
} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.flightFetchedResultsController sections] objectAtIndex:section]; 
    return [sectionInfo numberOfObjects]; 
} 
+0

Показать код. Является ли 'startTime' строкой? (введите дату). – Wain

+0

Это уже дата, код входящий ... –

+0

Вы неправильно получаете объекты. Я уточню свой ответ. – Fogmeister

ответ

5

Ваш раздел ключ имя пути должна соответствовать сортировки дескриптора первым.

Так что вы могли бы сделать ...

// sectionKeyNamePath = @"date". 

NSSortDescriptor *dateSD = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES]; 
NSSortDescriptor *startTimeSD = [NSSortDescriptor sortDescriptorWithKey:@"startTime" ascending:YES]; 

frc.request.sortDescriptors = @[dateSD, startTimeSD]; 

Если вы сделаете это, то он будет сортировать (и раздел) по дате, а затем отсортировать каждую секцию по STARTTIME.

Из кода

Вы получаете неправдоподобные объекты неправильно.

Чтобы получить объект, который нужно использовать ...

Flight *flight = [self.frc objectAtIndexPath:indexPath]; 

неправдоподобным контроллер результатов знает о его разделов и строк. Вам не нужно разделить его.

+0

Интересно, но это приводит к некоторым нечетным результатам. Например, нулевые дубликаты в моем представлении таблицы. Я добавил код в OP. –

+0

Я так не считаю, что получить объект «Flight», как вы предполагаете, будет только из первого раздела (первого массива объектов) из опыта. Поэтому для каждого раздела в таблице вам нужно получить соответствующие объекты раздела. Я чувствую, что, возможно, это разрешило, хотя это сделал чистый проект. Спасибо за подсказку совпадения первого дескриптора сортировки, хотя я чего-то не знал! –

+0

Указательный путь указывает на раздел и строку. Так оно и работает. Не то, чтобы я верю, как это работает, вот как это работает. Рад, что вы все разобрались. – Fogmeister

Смежные вопросы