2009-11-09 88 views
4

我有一个应用程序使用核心数据有一个我想分组的关系。我有我的.xcdatamodel文件生成NSManagedObject类,并且大部分似乎一切正常。核心数据/可可:@distinctUnionOfObjects不返回一个可用的NSArray *

给定一个父/子关系,我想做到以下几点:

家长有孩子的集合。孩子们有一个属性,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 

一切工作正常。

任何人都可以解释这种行为吗?我正在努力弄清楚这是如何工作的。

预先感谢任何帮助,您可以提供...

克里斯

+3

你所展示的代码是没有什么不同的,只不过你泄露了你在第二个例子中分开的数组(因为你不会发送一个释放消息,至少我们可以看到) 。请编辑您的问题以包含打印到调试器控制台的完整例外消息。 – 2009-11-09 14:15:50

+0

这是错误。看起来好像从valueForKeyPath返回的对象实际上不是一个NSArray。这很奇怪,因为initWithArray:需要一个NSArray *传递给它......这很奇怪!由于未捕获的异常'NSInvalidArgumentException',原因:'*** - [NSCFSet objectAtIndex:]:无法识别的选择器发送到实例0x3a3ff60' – 2009-11-09 19:25:43

+0

***终止应用程序此外,彼得,我在代码中进一步发布组。为了简单起见,我只是做了这个片段来显示造成这次事故的原因。 – 2009-11-09 19:27:08

回答

9

所以,我得到了这个苹果文档我的信息:Set and Array Operators ,其中指出“@distinctUnionOfObjects运算符返回一个数组,其中包含通过发送valueForKeyPath:返回给接收方中的每个项返回的不同对象,将关键路径传递给数组运算符的权利。“我认为返回的对象是一个NSArray,因为它说“数组”,当它应该可能说“数组或设置”。我将返回的对象更改为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: .....“

+0

这是正确的解决方案。你应该接受它。 – 2009-11-10 04:41:31

+0

不幸的是,我不能直到发布后2天。那我肯定会的! – 2009-11-10 06:54:19

3

你应该做到以下几点:

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