#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 и просто продолжить работу с массивами объектов напрямую.