11

在使用它来管理多对多关系时,Apple 的文档在两个方面是模糊的。-setPrimitiveValue:forKey:

他们首先声明:

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

最终?!那有什么意思?以后会不会失败-[NSManagedObjectContext save:]?当一个托管对象变成一个故障然后又被分页回来?什么时候?我可以编写一个测试用例来始终如一地按需重新创建故障吗?

其次,提供示例代码来正确处理这种情况,他们写道:

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

如果/当方法返回 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"];
    }
}

那是错的吗?

4

1 回答 1

6

只需将 的返回值变异-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 <CoreData/CoreData.h>

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

@implementation Folder
@dynamic children;
@end

Core Data 不仅会为属性生成 getter/setter 对,还会生成childrenmutable-set 访问器,因此您可以使用-mutableSetValueForKey:它并以最小的开销操作结果。

于 2008-09-27T21:48:24.367 回答