пользовательские разделы на основе текущей даты для nsfectedresultscontroller

#objective-c #core-data #nsfetchedresultscontroller #objective-c-blocks #comparator

#objective-c #core-данные #nsfetchedresultscontroller #objective-c-блоки #компаратор

Вопрос:

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

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

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

Я перепробовал множество способов заставить мой NSFetchedResultsController правильно сортировать результаты для отображения в таблице. Я обнаружил, что вы не можете сортировать по свойству transient в 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 comparisonResu<
    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 comparisonResu<
}];
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. Я обошел это, добавив поле newIssue в свой объект Issue. Это ужасная ошибка, так как теперь мне приходится преследовать каждый возможный случай, когда дата может быть изменена, и обновлять этот атрибут. Если когда-либо они не совпадут, это обязательно взорвется. Должен быть лучший способ.

Ответ №1:

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