2013-08-17 2 views
0

Итак, у меня есть этот объект NSSet, прямо из отношения основных данных. Этот NSSet содержит объекты, которые являются подклассами одного и того же базового объекта (назовем его RVSuperClass, который является подклассом NSManagedObject).NSSet перегруппирует объекты по классам

Моя конечная цель - перегруппировать эти объекты в UITableView, где каждый вид объекта (RVSuperClass подклассы) будет составлять один раздел.

Несмотря на то, что не много подклассов RVSuperClass (и, следовательно, не так много объектов «видов»), может быть много объектов в NSSet (сотни). Поэтому для цикла не то, что мне нужно.

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

ответ

2

> не много подклассов

Это сделало бы возможным иметь суперкласс иметь атрибут, который указывает на подкласс. Теперь группировка с полученными результатами контроллера sectionNameKeyPath - это бриз.

+0

Просто добавление: имя (подкласс) класса/объекта управляемого объекта недоступно как свойство, поэтому оно не может использоваться в запросе выборки или дескрипторе сортировки. Таким образом, сохранение подкласса явно в суперклассе является единственным вариантом. –

+0

Спасибо Mundi и Martin R. Я решил пойти с другим решением, даже если это тоже не очень элегантно ... –

0

Поскольку у меня есть контроль над подклассами моего RVSuperClass, я решил пойти с относительно неудобным решением, которое не масштабируется хорошо, но оно работает в этом случае.

В viewDidLoad, для каждого подкласса RVSuperClass создать предикат:

[NSPredicate predicateWithFormat: @"self isKindOfClass: %@", [RVSubclassA class]]; 

Использование filteredSetUsingPredicate: и добавив туда в NSSortDescriptor, я добавляю в результате NSArray к Ивар NSMutableArray, где каждый NSArray будет раздел таблицы.

Жаль, что мне нужно будет изменить этот код (и добавить еще один NSPredicate), если я решит добавить подкласс RVSuperClass позже.

+0

С учетом вашего комментария вы все равно должны принять лучший ответ, даже если вы его не реализовали. – Mundi

+0

Терпение мой друг. На данный момент я подтвердил ваш ответ, но я оставлю немного больше времени для ответа на другой вопрос, прежде чем принять какой-либо окончательный ответ. –

+0

Ты босс ;-) – Mundi

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