views:

339

answers:

2

Hi there, I have an application that uses Core Data that has a relationship that I would like to group by. I have NSManagedObject classes that were generated by my .xcdatamodel file, and everything seems to be working OK for the most part.

Given a parent / child relationship, I would like to do the following:

A parent has a collection of children. The children have a property, groupByProperty, that I would like to group on.

The following code:

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

produces an NSInvalidArgumentException when trying to set the child pointer.

However, when I do this:

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

everything works fine.

Can anyone explain this behavior? I'm going nuts trying to figure out how this works.

Thanks in advance for any help you can provide...

Chris

+1  A: 

You should do the following:

NSArray *groups = [parent valueForKeyPath:@"@distinctUnionOfObjects.children.groupByProperty"];
Child *child = [groups objectAtIndex:x];
unforgiven
+3  A: 

So, I got my information from this Apple document: Set and Array Operators, where it states "The @distinctUnionOfObjects operator returns an array containing the distinct objects returned by sending valueForKeyPath: to each item in the receiver, passing the key path to the right of the array operator." I assumed that the returned object is an NSArray, because it says "Array", when it should probably say "Array or Set". I changed the returned Object to an NSSet, and then used [[groups allObjects] objectAtIndex:x] to get my object out of there.

It now looks like this:

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

Thanks for your help, I guess I just needed to look at the exception a little bit more carefully, the key here being "-[NSCFSet objectAtIndex:....."

Chris T.
This is the correct solution. You should accept it as such.
Peter Hosey
Unfortunately, I cannot until 2 days after post. I will then for sure!
Chris T.