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