Сортировка NSFetchedResultsController в зависимости от того, к какой связи он принадлежит

Дескрипторы сортировки с пользовательскими блоками не поддерживаются в iOS6, поэтому мне нужно найти другой способ сделать это:

Объект Student может принадлежать к одному из двух наборов: confirmedClasses или pendingClasses. Я хочу получить студентов со следующим предикатом:

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ANY confirmedClasses.classId== %@
    OR ANY pendingClasses.classId == %@", currentClass.classId, currentClass.classId]];

Таким образом, пользователь может быть либо подтвержденным студентом в классе, либо ожидающим студентом. Я хочу отсортировать результаты так, чтобы все подтвержденные студенты были перечислены первыми, а ожидающие студенты — после всех подтвержденных студентов.

Есть идеи, как я могу это сделать?


person Snowman    schedule 17.10.2012    source источник


Ответы (2)


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

NSPredicate *confirmed = [NSPredicate predicateWithFormat:@"ANY confirmedClasses.classId== %@,currentClass.classId];

NSPredicate *pending = [NSPredicate predicateWithFormat:@"ANY pendingClasses.classId== %@,currentClass.classId];

NSArray *predicates = [NSArray arrayWithObjects:confirmed,pending,nil];

[fetchRequest setPredicate:[NSCompoundPredicate orPredicateWithSubpredicates:predicates]];

//Perform fetch into an array called 'results'

NSArray *filteredConfirmed = [results filteredArrayUsingPredicate:confirmed];
NSArray *filteredPending = [results filteredArrayUsingPredicate:pending];

NSArray *sortedResult = [filteredConfirmed arrayByAddingObjectsFromArray:filteredPending];
person ChrisH    schedule 18.10.2012
comment
Ну, дело в том, что я использую контроллер извлеченных результатов, и его можно отсортировать только до выборки, иначе это сработает. - person Snowman; 18.10.2012
comment
Может быть, вы можете сделать предикаты свойством класса, использующего FRC. Затем вы можете использовать составной предикат для FRC и фильтровать объекты FRC при изменении данных. Тогда просто используйте sortedResult в качестве источника данных? - person ChrisH; 18.10.2012
comment
Вы также можете рассмотреть возможность добавления атрибута к управляемому объекту класса, чтобы указать, является ли он ожидающим или текущим. Затем вы можете сортировать по этому атрибуту. - person ChrisH; 18.10.2012

Почему бы просто не сделать две отдельные выборки? Таким образом, вы будете иметь всех подтвержденных студентов в одном массиве, а всех ожидающих студентов в другом. Будет проще объединить две группы в желаемом порядке, чем извлекать их все, а затем сортировать по статусу.

person Caleb    schedule 18.10.2012