Пользовательские разделы на основе текущей даты для nsfectedresultscontroller - PullRequest
0 голосов
/ 20 октября 2011

Я хочу использовать три раздела для просмотра таблицы:

Новые проблемы = проблемы, о которых сообщалось в эту дату, независимо от статуса. Активные проблемы = проблемы, о которых сообщалось до этой даты, по-прежнему требующие принятия последующих мер. Закрытые проблемы = проблемы, о которых сообщалось до этой даты, не требующие принятия последующих мер.

У меня есть временное свойство, которое правильно сообщает разделы - 0,1,2 соответственно.

Я пробовал многочисленные способы заставить мой NSFetchedResultsController правильно сортировать результаты для отображения таблицы. Я считаю, что вы не можете отсортировать переходное свойство в NSFetchedResultsController, поэтому я попытался отсортировать так:

     //create sort keys
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateStyle:NSDateFormatterShortStyle];
[df setTimeStyle:NSDateFormatterNoStyle];
NSString *nowString = [df stringFromDate:[NSDate date]];
NSDate *todayDateWithoutTime = [df dateFromString:nowString];
[df release];
NSSortDescriptor *sortIsNew = [[NSSortDescriptor alloc] initWithKey:@"dateReported" ascending:YES comparator:^(id obj1,id obj2){
    NSDate *date1 = obj1;
    NSDate *date2 = obj2;
    NSComparisonResult comparisonResult;
    if ([date1 timeIntervalSinceDate:todayDateWithoutTime] == 0) {
        if ([date2 timeIntervalSinceDate:todayDateWithoutTime] == 0) {
            comparisonResult = NSOrderedSame;
        } else {
            comparisonResult = NSOrderedAscending;
        }
    } else {
        if ([date2 timeIntervalSinceDate:todayDateWithoutTime] == 0) {
            comparisonResult =  NSOrderedDescending;
        } else {
            comparisonResult = NSOrderedSame;
        }
    }
    return comparisonResult;
}];
NSSortDescriptor *sortByFollowUp = [[NSSortDescriptor alloc] initWithKey:@"requiresFollowUp" ascending:NO];
NSSortDescriptor *sortByReportDate = [[NSSortDescriptor alloc] initWithKey:@"dateReported" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortIsNew, sortByFollowUp,sortByReportDate, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

Не уверен, что я правильно использовал блок, но в любом случае он никогда не вызывается, насколько я могу судить. Я положил туда несколько отчетов, но они не сообщают. Очевидно, дескрипторы «sortByFollowUp» и «sortByReportDate» работают, как и ожидалось, но не «sortIsNew». Если нет новых проблем, все работает нормально. В любом случае, когда появляются новые проблемы для этого первого раздела, приложение аварийно завершает работу, поскольку сортировка не соответствует разделам.

Я знаю, что могу сделать это очень легко с помощью прямых запросов на выборку и массивов. Кажется правильным использовать контроллер извлеченных результатов только для того, чтобы избежать вытягивания всей таблицы проблем в память, когда большинство из них не нужно, и только некоторые из них будут отображаться в любой момент. Неужели так сложно использовать его, когда вам нужны пользовательские разделы?

1 Ответ

0 голосов
/ 01 августа 2012

Поскольку я не получил никаких ответов, я закрываю вопрос своими собственными выводами.Сохранение переходного значения в качестве атрибута представляется на самом деле самым простым исправлением.Я экспериментировал с вариантами комбинированного NSFetchedResultsController и метода Custom array, но, похоже, вы теряете многие преимущества NSFetchedResultsController таким образом.Вам придется преследовать все полученные события и обновлять массивы в зависимости от обстоятельств.Похоже, что в этом случае вы можете также пропустить NSFetchedResultsController и просто продолжить работу с массивами объектов напрямую.

...