1

我想解析一个XML文档,并使用背景队列将其数据存储在核心数据存储中。我正在使用的iOS推出了新的嵌套UIManagedObjectContext概念5.在NSManagedObjectContext后台线程解析和“不同的上下文”问题

我添加了一个新的类别,以我的NSManagedObject公司,负责处理公司的具体数据解析:

- (void)parseAttributesFrom:(NSString*)xmlStr 
      inManagedObjectContext:(NSManagedObjectContext*)managedObjectContext 
    { 
    NSManagedObjectContext * context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 

    context.parentContext = self.managedObjectContext; 
    [context performBlock:^{ 

       IBCompany *company = self; 
       [company setValue:[[[document.root childNamed:@"CoIDs"] childWithAttribute:@"Type" value:@"CompanyName"] value] forKey:@"companyName"]; 
      ... 

这是我怎么称呼这个方法:[company parseAttributesFrom:xmlStr inManagedObjectContext:self.managedDocument.managedObjectContext]; 请注意,即使我将托管对象上下文作为参数传递给方法,我的问题仍未更改。

当我运行的代码,它崩溃,我设置annualPeriod公司与错误信息NSInvalidArgumentException:'Illegal attempt to establish a relationship 'company' between objects in different contexts (source = <IBEstPeriod: ...

IBEstPeriod *annualPeriod = [NSEntityDescription insertNewObjectForEntityForName:@"IBEstPeriod" inManagedObjectContext:context]; 
[annualPeriod setCompany:company]; 

我努力理解为什么错误应当与不同的上下文当代码运行在相同的背景创意中时,代码为。我将不胜感激任何帮助!!

回答

1

我认为,原因是IBCompany *company = self;context你通过,然后你在另一个上下文中设置新的连接。

这就是原因。如果你正在使用UIManagedDocument在这里

context.parentContext = self.managedObjectContext; 

+1

你说得对,两个托管对象都有不同的上下文。我通过在后台上下文中重新提取公司管理对象来解决问题。我的背景代码现在可用。谢谢,尼基塔! – AlexR

1

您可能无法做到这一点

[company parseAttributesFrom:xmlStr inManagedObjectContext:self.managedDocument.managedObjectContext]; 

这是因为UIManagedDocument已经使用嵌套的背景和self.managedDocument.managedObjectContext有其父上下文集。现在你将它交换出来,并通过这样做来破坏事物。

以下是UIManagedDocument Class Reference的报价。

为了支持异步数据写入,Core Data实际上使用嵌套托管对象上下文的一对 。父上下文在 专用线程上创建,子上下文在主线程上创建。您 从managedObjectContext属性获取子上下文。

相关问题