当前位置:  开发笔记 > 编程语言 > 正文

setPrimitiveValue:forKey:和to-many关系

如何解决《setPrimitiveValue:forKey:和to-many关系》经验,为你挑选了1个好方法。

当使用它来管理多对多关系时,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"];
    }
}

那是错的吗?



1> Chris Hanson..:

只是改变-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:它并以最小的开销操作结果.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有