Core data 保存导致';非法建立关系的企图…';

Core data 保存导致';非法建立关系的企图…';,core-data,nsmanagedobjectcontext,Core Data,Nsmanagedobjectcontext,我正在后台线程上执行NSO操作,该线程将数据导入核心数据。为此,我首先创建导入记录(“导入”),然后导入与导入记录相关的对象。如果保存托管对象上下文,下次尝试将导入的对象链接到导入记录时将失败: Illegal attempt to establish a relationship 'import' between objects in different contexts (source = <NSManagedObject: 0x1067bb730> (entity: Genre

我正在后台线程上执行NSO操作,该线程将数据导入核心数据。为此,我首先创建导入记录(“导入”),然后导入与导入记录相关的对象。如果保存托管对象上下文,下次尝试将导入的对象链接到导入记录时将失败:

Illegal attempt to establish a relationship 'import' between objects in different contexts (source = <NSManagedObject: 0x1067bb730> (entity: Genre; id: 0x1053330c0 <x-coredata:///Genre/tC6A85CFE-3D0A-4E29-9186-4FD46104AEBC60> ; data: {
    import = nil;
    name = Polka;
}) , destination = <NSManagedObject: 0x106736170> (entity: Import; id: 0x103b571e0 <x-coredata://440D80CF-7C56-4B6F-9778-990032A76B8B/Import/p1> ; data: <fault>))
更新:根据请求,我提供了合并更改的代码:。它可以在NSO操作中找到。我尝试过将更改保存到主主主运行中心,但结果都是一样的

- (void)mergeChanges:(NSNotification*)notification
{
    TNAppDelegate *del = (TNAppDelegate *)[[NSApplication sharedApplication] delegate];
    if ([notification object] == [del managedObjectContext]) return;

    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(mergeChanges:) withObject:notification waitUntilDone:YES];
        return;
    }

    [[del managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];
}

直到今天,我还没有弄清楚到底发生了什么。最后,我重新启动了我的项目,并从头开始设计它。我过去曾将其用作参考,但不知何故,它完全采用了它们的代码。

托管对象
import
newGenreObject
是否真的是在同一托管对象上下文中创建的?因为错误消息指出它们不是。代码应该非常清楚:它们都来自
moc
。好的,我只是问了一下,因为你“稍微修改了代码”,错误消息清楚地表明,您尝试将一个MOC中的
类型
对象设置为另一个MOC中的
导入
对象。啊,我明白了,对不起。否,唯一的修改是添加额外的保存以加速错误。(否则,每创建50次NewGeneObject就会进行一次保存。)能否显示为更改通知注册的
mergeChanges:
方法的代码?
- (void)mergeChanges:(NSNotification*)notification
{
    TNAppDelegate *del = (TNAppDelegate *)[[NSApplication sharedApplication] delegate];
    if ([notification object] == [del managedObjectContext]) return;

    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(mergeChanges:) withObject:notification waitUntilDone:YES];
        return;
    }

    [[del managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];
}