Core data 核心数据在2个MOC之间“深度复制”,处理多个关系,使用KVC集合代理对象

Core data 核心数据在2个MOC之间“深度复制”,处理多个关系,使用KVC集合代理对象,core-data,collections,kvc,object-graph,Core Data,Collections,Kvc,Object Graph,我正在尝试将托管对象从源持久性存储执行到现有持久性存储的“深度复制”。借用任务代码以在目标上下文中建立多对多关系。完整的代码是可用的 我的困惑在于下面这个方法 - (void)establishToManyRelationship:(NSString*)relationshipName fromObject:(NSManagedObject*)object // “Copied Object" in TargetContext

我正在尝试将托管对象从源持久性存储执行到现有持久性存储的“深度复制”。借用任务代码以在目标上下文中建立多对多关系。完整的代码是可用的

我的困惑在于下面这个方法

- (void)establishToManyRelationship:(NSString*)relationshipName
                         fromObject:(NSManagedObject*)object // “Copied Object" in TargetContext
                      withSourceSet:(NSMutableSet*)sourceSet // NSMutableSet in Source Context.
{
    if (!object || !sourceSet || !relationshipName) {
        NSLog(@"SKIPPED establishing a To-Many relationship from %@", [self objectInfo:object]);
        NSLog(@"Due to missing Info!");
        return;
    }

    //  Returns a mutable set proxy that provides read-write access to the unordered to-many relationship specified by a given key.
    NSMutableSet *copiedSet =[object mutableSetValueForKey:relationshipName];

    //in sourceContext, "Many"side of relationship represented by a Set, where "relatedObject" belongs to
    for (NSManagedObject *relatedObject in sourceSet) {

        // Related Copied Object in TargetContext
        NSManagedObject *copiedRelatedObject =
            [self copyUniqueObject:relatedObject toContext:object.managedObjectContext];

        if (copiedRelatedObject) {
            [copiedSet addObject:copiedRelatedObject];
            NSLog(@"A copy of %@ is now related via To-Many '%@' relationship to %@", [self objectInfo:object],
                  relationshipName,
                  [self objectInfo:copiedRelatedObject]);
        }
    }
    // REMOVE the relationship from memory after it is committed to disk
    [CoreDataImporter saveContext:object.managedObjectContext];

    [object.managedObjectContext refreshObject:object mergeChanges:NO];
}
我的问题是

[copiedSet addObject:copiedRelatedObject];
,它在由mutableSetValueForKey:invocation生成的集合代理对象上执行,并且没有通过参数或此方法的返回值显式返回结果

- (void)establishToManyRelationship:(NSString*)relationshipName
                         fromObject:(NSManagedObject*)object 
                      withSourceSet:(NSMutableSet*)sourceSet

,如何确保存在由在目标上下文中创建的复制相关对象组成的NSMutableSet?或者我永远不需要在目标上下文中有这样一个复制集的引用?通过使用KVC实现的集合代理对象,目标上下文中的对象图能否围绕表示多对多关系一侧的复制对象神奇地建立起来?

经过几次测试,我发现了这一点

第二个参数NSManagedObject*对象可以通过代理NSMutableSet*copiedSet进行操作,该代理由对mutableSetValueForKey的KVC调用返回:

加载到代理上的任何操作都会神奇地/实际地将NSManagedObject*对象的关系作为此MO的属性反射回来