核心数据/可可:@distinctUnionOfObjects 不返回可用的 NSArray*
Posted
技术标签:
【中文标题】核心数据/可可:@distinctUnionOfObjects 不返回可用的 NSArray*【英文标题】:Core Data / Cocoa : @distinctUnionOfObjects not returning a usable NSArray* 【发布时间】:2009-11-09 12:50:08 【问题描述】:我有一个使用 Core Data 的应用程序,该应用程序具有我想要分组的关系。我有由我的 .xcdatamodel 文件生成的 NSManagedObject 类,而且大部分情况下一切似乎都正常。
鉴于父/子关系,我想做以下事情:
一个父母有一个孩子的集合。孩子们有一个属性 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
一切正常。
谁能解释这种行为?我要疯了,想弄清楚它是如何工作的。
提前感谢您提供的任何帮助...
克里斯
【问题讨论】:
您显示的代码没有什么不同,除了您泄漏了在第二个示例中分配的数组(因为您没有向它发送发布消息,至少我们可以看到)。请编辑您的问题以包含打印到调试器控制台的完整异常消息。 这是错误。似乎从 valueForKeyPath: 返回的对象实际上不是一个 NSArray。不过这很奇怪,因为 initWithArray: 需要一个 NSArray* 传递给它……这很奇怪! *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*** -[NSCFSet objectAtIndex:]: unrecognized selector sent to instance 0x3a3ff60” 另外,Peter,我正在代码中进一步发布组。为了简单起见,我制作了这个 sn-p 以显示导致崩溃的原因。 【参考方案1】:所以,我从这个 Apple 文档中获得了我的信息:Set and Array Operators,其中声明“@distinctUnionOfObjects 运算符返回一个数组,其中包含通过向接收器中的每个项目发送 valueForKeyPath: 返回的不同对象,将键路径传递到数组运算符的右侧。” 我假设返回的对象是一个 NSArray,因为它说的是“Array”,而它可能应该说的是“Array 或 Set”。我将返回的 Object 更改为 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:.....”
【讨论】:
不幸的是,我要等到发布后的 2 天。那我肯定会的!【参考方案2】:您应该执行以下操作:
NSArray *groups = [parent valueForKeyPath:@"@distinctUnionOfObjects.children.groupByProperty"];
Child *child = [groups objectAtIndex:x];
【讨论】:
以上是关于核心数据/可可:@distinctUnionOfObjects 不返回可用的 NSArray*的主要内容,如果未能解决你的问题,请参考以下文章
核心数据/可可:@distinctUnionOfObjects 不返回可用的 NSArray*
可可 iphone 核心数据谓词一对多 fetchrequest