当使用它来管理多对多关系时,Apple的文档-setPrimitiveValue:forKey:
在两个方面含糊不清.
首先他们说:
如果您尝试设置与新NSMutableSet对象的多对多关系,它将(最终)失败.
最后?那有什么意思?它会在以后失败-[NSManagedObjectContext save:]
吗?当托管对象变成故障然后再回来时?什么时候?我是否可以编写一个测试用例来持续按需重新创建失败?
其次,提供示例代码以正确处理这种情况,他们写道:
首先使用现有的set
primitiveValueForKey:
(确保方法不返回nil
)
我应该怎么做,如果/当方法不返回零?assert()
它并立即失败,因为这意味着整个对象图已损坏,保存将导致数据丢失?NSAssert()
在它上面作为对来电者的警告,但按下(默默无为)?
现在我只是NS[Mutable]Set
在那种情况下直接分配我想要的东西,就像这样:
- (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:withSetMutation:usingObjects:
和-didChangeValueForKey:withSetMutation:usingObjects:
围绕你的操纵; 你没有在上面的代码中显示这个.
- (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]; }
如果你可以瞄准Leopard,你不必担心这个; 您可以使用Core Data的内置属性支持:
#import@interface Folder : NSManagedObject @property (readwrite, retain) NSSet *children; @end @implementation Folder @dynamic children; @end
核心数据不仅会生成children
属性的getter/setter对,还会生成可变集访问器,因此您可以使用-mutableSetValueForKey:
它并以最小的开销操作结果.