更新:我想的问题是,当孩子上下文保存不更新父上下文。仍然需要帮助。多上下文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;
当通过notification-NSManagedObjectContextDidSaveNotification更新主MOC时,背景插入MOC挂起UI。 经过一番谷歌搜索之后,我发现父母孩子MOC没有挂起UX,与传统的MOC相比 – vshall
我无法确认代码是否正在尝试访问设置,试图嵌入保存在performBlockAndWait也。 – vshall
vshall,由于您没有列出您的来源,因此您认为为什么您认为亲子MOC更快并且不挂断用户界面,我无法解决您的问题。根据我的经验,情况并非如此。至于你的情况,我认为你正试图在保存之前访问数据。你也许可以通过延迟阅读代码来测试它是如此。安德鲁 – adonoho