Базовые данные / Какао: @distinctUnionOfObjects не возвращает пригодный для использования NSArray * - PullRequest
4 голосов
/ 09 ноября 2009

У меня есть приложение, использующее базовые данные, которое имеет отношение, которое я хотел бы сгруппировать. У меня есть классы NSManagedObject, которые были сгенерированы моим файлом .xcdatamodel, и в большинстве случаев все работает нормально.

Учитывая отношения родитель / ребенок, я хотел бы сделать следующее:

У родителей есть коллекция детей. У детей есть свойство groupByProperty, по которому я хотел бы сгруппировать.

Следующий код:

NSSet *allChildren = parent.children;
NSArray *groups = [allChildren valueForKeyPath:@"@distinctUnionOfObjects.groupByProperty"];
Child *child = [groups objectAtIndex:x]; //x is the row that I would like to retrieve

создает NSInvalidArgumentException при попытке установить дочерний указатель.

Однако, когда я делаю это:

NSSet *allChildren = parent.children;
NSArray *groups = [[NSArray alloc] initWithArray:[allChildren valueForKeyPath:@"@distinctUnionOfObjects.groupByProperty"]];
Child *child = [groups objectAtIndex:x]; //x is the row that I would like to retrieve

все отлично работает.

Может кто-нибудь объяснить это поведение? Я схожу с ума, пытаясь понять, как это работает.

Заранее благодарим за любую помощь, которую вы можете оказать ...

Chris

Ответы [ 2 ]

9 голосов
/ 09 ноября 2009

Итак, я получил информацию из этого документа Apple: Операторы Set и Array , где указано « Оператор @distinctUnionOfObjects возвращает массив, содержащий различные объекты, возвращенные отправкой valueForKeyPath : каждому элементу в получателе, передавая путь ключа справа от оператора массива. " Я предположил, что возвращаемый объект является NSArray, потому что он говорит" Array ", когда он, вероятно, должен сказать" Массив или набор ". Я изменил возвращенный объект на NSSet, а затем использовал [[groups allObjects] objectAtIndex: x], чтобы получить мой объект оттуда.

Теперь это выглядит так:

NSSet *allChildren = parent.children;
NSSet *groups = [allChildren valueForKeyPath:@"@distinctUnionOfObjects.groupByProperty"];
Child *child = [[groups allObjects] objectAtIndex:x]; //x is the row that I would like to retrieve

Спасибо за вашу помощь, я думаю, мне просто нужно было рассмотреть исключение немного более тщательно, ключ здесь следующий: "- [ NSCFSet objectAtIndex: ....."

3 голосов
/ 09 ноября 2009

Вы должны сделать следующее:

NSArray *groups = [parent valueForKeyPath:@"@distinctUnionOfObjects.children.groupByProperty"];
Child *child = [groups objectAtIndex:x];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...