2013-10-29 28 views
1

更新:我想的问题是,当孩子上下文保存不更新父上下文。仍然需要帮助。多上下文CoreData使用线程


我已经尝试了多上下文(父 - 子)核心数据的许多例子。

此前,我的应用程序使用传统的存储数据的方式,即我使用OperationQueue从服务器获取数据并使用MOC保存到数据库并保存到mainMOC的mergeChanges通知:NSManagedObjectContextDidSaveNotification 。

而不干扰该应用的流动,(即除去OperationQueue),我试图执行亲子ManagedObjectContext关系,其中我用concurrencyType一个privateMOC为NSPrivateQueueConcurrencyType具有persistantStoreCoordinator,并与concurrenyType的mainMOC如NSMainQueueConcurrencyType这是私人机构的孩子。并且在队列中,我有一个tempMOC,其中concurrencyType为NSPrivateQueueConcurrencyType,它是mainMOC的子项。

同时节约,我窝三个MOCS的performBlock为 -

[tempMOC performBlock:^{ 
     if (![tempMOC save:&error]) { 
      NSLog(@"Error : %@",error); 
     } 
     [mainMOC performBlock:^{ 
      if (![mainMOC save:&error]) { 
       NSLog(@"Error : %@",error); 
      } 
      [privateMOC performBlock:^{ 
       if (![privateMOC save:&error]) { 
        NSLog(@"Error : %@",error); 
       } 
      }]; 
     }]; 
    }]; 

我得到这样的错误CoreData 1560和1570,而mainMOC试图保存。 NSValidationErrorKey错误,它说有些值是nil。 是否tempMOC的变化不会去mainMOC?我没有挖掘,但据我所知,它不应该是零。 什么可能是错误?请帮忙。

更新:我试图打印tempMOC的对象,我看到这样正确的价值观:

<Element_Name: 0xc0b59c0> (entity: Element_Name; id: 0xc07ca90 <x-coredata:///Element_Name/t2DCD57A8-4C1A-4AF7-A10E-5B9603E2BB8730> ; data: { 
    tag1 = nil; 
    tag2 = 3430065; 
    tag3 = 600; 
    tag4 = N; 
    tag5 = "2013-10-29 00:00:00 +0000"; 
    tag6 = nil; 
    tag7 = 327842701; 
    relation = "0xbf1f760 <x-coredata://87C54A94-701E-4108-826E-4D98A53380F9/Relation/p1>"; 
    tag8 = "Some_Value"; 

我试图打印mainMOC的对象,我看到nil价值,而不是像数据:

<Element_Name: 0xbd47a50> (entity: Element_name; id: 0xc0b14b0 <x-coredata:///Element_Name/t2DCD57A8-4C1A-4AF7-A10E-5B9603E2BB8740> ; data: { 
    tag1 = nil; 
    tag2 = nil; 
    tag3 = 0; 
    tag4 = nil; 
    tag5 = nil; 
    tag6 = nil; 
    tag7 = nil; 
    relation = "0xbd586c0 <x-coredata://87C54A94-701E-4108-826E-4D98A53380F9/relation/p1>"; 
    tag8 = nil; 

回答

0

vshall,

如果你已经有一个背景插入MOC模式的工作,你为什么TR是否应该转向亲​​子关系?它不是更快。而且,从我所看到的关于您的实现的情况来看,您最终会阻止主线程。

有使用亲子关系MOC许多很好的理由。其中大多数涉及创建临时或只读MOC。第二大用例是让您的主要MOC成为私人并发MOC的孩子。这种方式节省了“快速”,并在后台线程上完成。根据我的经验,插入到主MOC的儿童并发MOC中的背景较慢,并导致UI出现口吃。

在回答你的问题,你想你的嵌入式一套节省完成之前访问项目。因此,你的数据被破坏,你会得到例外。

Andrew

+0

当通过notification-NSManagedObjectContextDidSaveNotification更新主MOC时,背景插入MOC挂起UI。 经过一番谷歌搜索之后,我发现父母孩子MOC没有挂起UX,与传统的MOC相比 – vshall

+0

我无法确认代码是否正在尝试访问设置,试图嵌入保存在performBlockAndWait也。 – vshall

+0

vshall,由于您没有列出您的来源,因此您认为为什么您认为亲子MOC更快并且不挂断用户界面,我无法解决您的问题。根据我的经验,情况并非如此。至于你的情况,我认为你正试图在保存之前访问数据。你也许可以通过延迟阅读代码来测试它是如此。安德鲁 – adonoho

1

我刚碰到同样的问题,发现了一个解决方案。没有你的其他代码我不能保证这会解决你的问题,但它确实解决了我的问题。

我正在实例化一些NSManagedObject类,修改它们的一些属性,然后将它们插入临时或子级NSManagedObjectContext。所有的属性都显示得很好,就像你的情况一样。

但是,当我保存了上下文并且变更被推送到父项NSManagedObjectContext时,所有属性都无效(就像你的情况一样)。

当我仅使用一个NSManagedObjectContext时,我还没有观察到这种行为,而且我还没有试用过较旧的NSManagedObjectContextDidSaveNotification模式。

解决方案当然是在初始化之后,任何属性分配完成之前将NSManagedObject添加到上下文中。

相关问题