Objective c setPrimitiveValue:forKey:和多个关系

Objective c setPrimitiveValue:forKey:和多个关系,objective-c,cocoa,core-data,Objective C,Cocoa,Core Data,当苹果用它来管理许多关系时,它在两个方面是模糊的 首先,他们声明: 如果您试图将一个对多关系设置为一个新的NSMutableSet对象,它将(最终)失败 最终这是什么意思?稍后在-[NSManagedObjectContext保存:期间是否会失败?当托管对象变为故障,然后重新分页时?什么时候我是否可以编写一个测试用例来持续地按需重新创建故障 第二,提供正确处理这种情况的示例代码,他们写道: 首先使用primitiveValueForKey:获取现有集(确保该方法不返回nil) 如果/当方法返回n

当苹果用它来管理许多关系时,它在两个方面是模糊的

首先,他们声明:

如果您试图将一个对多关系设置为一个新的NSMutableSet对象,它将(最终)失败

最终这是什么意思?稍后在
-[NSManagedObjectContext保存:
期间是否会失败?当托管对象变为故障,然后重新分页时?什么时候我是否可以编写一个测试用例来持续地按需重新创建故障

第二,提供正确处理这种情况的示例代码,他们写道:

首先使用
primitiveValueForKey:
获取现有集(确保该方法不返回
nil

如果/当方法返回nil时,我应该怎么做
assert()
it并立即失败,因为这意味着整个对象图已损坏,保存将导致数据丢失
NSAssert()
将其作为对呼叫方的警告,但按on(无提示地什么也不做)

现在我只是直接分配我想要的
NS[Mutable]集合
,就像这样:

- (void)setChildren:(NSSet*)value_ {
    NSMutableSet *mutableRelationshipSet = [[[self primitiveValueForKey:@"children"] mutableCopy] autorelease];
    if (mutableRelationshipSet) {
        [mutableRelationshipSet setSet:value_];
        [self setPrimitiveValue:mutableRelationshipSet forKey:@"children"];
    } else {
        [self setPrimitiveValue:value_ forKey:@"children"];
    }
}

这是错误的吗?

只需将
-primitiveValueForKey:
的返回值作为可变集进行变异,相信它的返回值会做正确的事情

在操作过程中,一定要使用
-willChangeValueForKey:with设置变异:UsingObject:
-didChangeValueForKey:with设置变异:UsingObject:
;您在上面的代码中没有显示这一点

- (void)setChildren:(NSSet *)value {
    [self willChangeValueForKey:@"children" withSetMutation:NSKeyValueSetSetMutation usingObjects:value];

    NSMutableSet *primitiveValue = [self primitiveValueForKey:@"children"];

    [primitiveValue setSet:value];

    [self didChangeValueForKey:@"children" withSetMutation:NSKeyValueSetSetMutation usingObjects:value];
}
如果你能瞄准豹子,你就不必担心这一点;您可以改用Core Data的内置属性支持:

#import <CoreData/CoreData.h>

@interface Folder : NSManagedObject
@property (readwrite, retain) NSSet *children;
@end

@implementation Folder
@dynamic children;
@end
#导入
@接口文件夹:NSManagedObject
@属性(读写、保留)NSSet*子项;
@结束
@实现文件夹
@动态儿童;
@结束
核心数据不仅将为
子属性
生成一个getter/setter对,还将为可变集访问器生成一个getter/setter对,因此您可以对其使用
-mutableSetValueForKey:
,并以最小的开销操纵结果