ren*_*sch 11 cocoa core-data objective-c
当使用它来管理多对多关系时,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"];
}
}
Run Code Online (Sandbox Code Playgroud)
那是错的吗?
只是改变-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];
}
Run Code Online (Sandbox Code Playgroud)
如果你可以瞄准Leopard,你不必担心这个; 您可以使用Core Data的内置属性支持:
#import <CoreData/CoreData.h>
@interface Folder : NSManagedObject
@property (readwrite, retain) NSSet *children;
@end
@implementation Folder
@dynamic children;
@end
Run Code Online (Sandbox Code Playgroud)
核心数据不仅会生成children属性的getter/setter对,还会生成可变集访问器,因此您可以使用-mutableSetValueForKey:它并以最小的开销操作结果.
| 归档时间: |
|
| 查看次数: |
2168 次 |
| 最近记录: |