ios - 带线程的多上下文 CoreData

标签 ios iphone objective-c core-data nsmanagedobjectcontext


更新: 我想问题是保存子上下文时父上下文没有更新。仍然需要帮助。


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

以前我的应用程序使用传统的方式存储数据,即我使用了一个 OperationQueue,我从服务器获取数据并使用 MOC 保存到数据库,并在保存时向 mainMOC 发出通知以进行 mergeChanges:NSManagedObjectContextDidSaveNotification。

在不影响应用程序流程的情况下(即删除 OperationQueue),我尝试实现父子 ManagedObjectContext 关系,其中我使用了一个 concurrencyType 为 NSPrivateQueueConcurrencyType 的 privateMOC,它有一个 persistantStoreCoordinator,并且concurrenyType 为 NSMainQueueConcurrencyType 的 mainMOC,它是 privateMOC 的子级。在队列中,我有一个 concurrencyType 为 NSPrivateQueueConcurrencyType 的 tempMOC,它是 mainMOC 的子级。

保存时,我将三个MOC的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);
                }
            }];
        }];
    }];

当 mainMOC 试图保存时,我收到类似 CoreData 1560 和 1570 的错误。 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;

最佳答案

我刚刚遇到了同样的问题并找到了解决方案。如果没有您的其余代码,我无法保证这会解决您的问题,但它确实解决了我的问题。

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

但是当我保存该上下文并将更改推送到父 NSManagedObjectContext 时,所有属性都被取消(就像您的情况一样)。

当我只使用一个 NSManagedObjectContext 时,我没有观察到这种行为,我也没有尝试过旧的 NSManagedObjectContextDidSaveNotification 模式。

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

关于ios - 带线程的多上下文 CoreData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19666178/

相关文章:

iphone - 无法使用 UIScrollView 和 pagingEnabled=YES 禁用弹跳

ios - 使用 callkit 接听电话后如何打开通话 UI

iphone - IOS 上的 YouTube IFrame API 和 webkitExitFullScreen [重新访问]

iphone - 如何合并两个 mp3 文件 iOS?

iOS 设备未使用 GDAsyncUdpSocket 接收 UDP 多播

ios - UIImage 填充颜色但不填充边框

ios - 点击图像时如何禁用 phonegap/cordova 上的图像缩放?

ios - Facebook 和 Parse 集成无法识别的选择器

ios - Flutter:由于集成了 firebase 和 Admob,无法构建 iOS 应用程序

ios - 允许用户从下拉列表或 map 中选择位置?