12

我有两个实体,我将它们称为 A 和 B。它们在两个方向上都配置了多对多关系,因此 A.myBs 和 B.myAs 都是 NSSet。

这是我奇怪的问题。

当我将 B 添加到 A 实体时,我使用 mutableSetValueForKey 执行此操作,如下所示:

NSMutableSet *myBSet = [myA mutableSetValueForKey:@"myBs"];
[myBSet addObject:theBtoAdd];

这确实将 theBtoAdd 添加到 A 实体,但不添加反向关系。核心数据上下文保存不会出现任何错误,但我的 A 对象没有 B 逆集。如果我退出应用程序,即使部分关系也不会保存。

这是奇怪的部分......如果我只是切换我的代码并做相反的事情(有一些原因,这对于我的特定应用程序来说更难做到) - 将 A 添加到 B 而不是像这样将 B 添加到 A :

NSMutableSet *myASet = [myB mutableSetValueForKey:@"myAs"];
[myASet addObject:theAtoAdd];

它工作得很好。顺便说一句,我还有很多其他有效的关系。只是这个没有。

其他几件事:1)我的核心数据对象模型看起来不错,但这是我在 Xcode 4 下添加的第一个新实体 2)我检查、重新检查并盲目查看我的自定义 NSManagedObjects,但它们看起来很好 - 声明为动态的、NSSet、没有冲突的 setter/getter... 等等。

任何帮助或调试建议将不胜感激。谢谢!

4

3 回答 3

7

我只是有同样的问题,这就是为什么我看到这个问题。也许我的解决方案会帮助一些处于相同情况的人。

对我来说,答案是在 NSManagedObject 子类中我已经覆盖了:

- (void)willChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects

- (void)didChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects

这可以防止将正确的通知发送到处理自动反向关系的父类 (NSManagedObject)。

于 2012-01-23T15:12:46.660 回答
3

如果您要覆盖这些方法中的任何一个,我发现了错误

// KVO change notification
- (void)willChangeValueForKey:(NSString *)key;
- (void)didChangeValueForKey:(NSString *)key;
- (void)willChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects;
- (void)didChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects;

这将导致 NSManagedObject 无法正常工作并且无法正确设置关系

Apple 文档:您不得覆盖这些方法。

于 2016-02-29T14:26:16.977 回答
0

如果您要对托管对象进行子类化,不应该有自动生成的多关系方法吗?所以你只需要打电话:

[aObject addBObject:bObject];
于 2011-06-02T18:36:13.333 回答