如何"告诉"管理必须删除和/或插入的对象的父上下文?

时间:2015-09-27 17:50:34

标签: ios core-data concurrency nsmanagedobject nsmanagedobjectcontext

我在主队列中有一个父NSmanagedObjectContext,在一个私有队列中有一个子NSManagedObjectContext。我将父上下文中的一组托管对象传递给它的子对象。然后,子上下文具有来自其父对象的托管对象,然后插入新的托管对象。我在私有队列中对子上下文中的所有托管对象进行了一些处理,这些托管对象来自父级和它自己的新对象,并且在进程结束时,我需要告诉父级:

  • 需要删除哪个托管对象
  • 需要使用子级中的新托管对象替换其中哪个托管对象
  • 需要将子项中的哪个托管对象插入父级

是否可以在上下文之间使用父/子关系?即使他们属于不同的队列?或者是父/子关系仅适用于执行某些托管对象的属性更改,但它不适用于托管对象的删除和插入?

如果无法使用父/子关系管理此方案,那么方法应该是什么?

提前致谢

编辑:我发现的示例只是使用子上下文来编辑父项的托管对象,然后在编辑结束时将更改应用于父项。所以我不确定是否可以使用子上下文来删除或插入父对象。

2 个答案:

答案 0 :(得分:1)

当子上下文调用save()时,更改将被推送到父上下文。这意味着,更新父上下文的整个对象图以反映子上下文的状态。

因此,您无需做任何事情。删除的对象将消失,添加的对象将在那里,编辑的对象将被更新。

答案 1 :(得分:0)

这是一个代码片段(缺少一些块),它执行基于子项的删除,然后将其传递给父项。

[childContext performBlock:^{
    // query array of messages

    // LOTS OF CODE

    // Loop through them and delete each message


    // Loop through each message
    for (id emptyMessage in emptyMessages) {

        i++;
        // Work in ContextBlocks...
        //            [childContext performBlock:^{

        __block AHRSMessage *msg = (AHRSMessage *) [childContext objectWithID:emptyMessage];

        [childContext deleteObject:msg];


        if (i % modFactor == 0) {
            self.percentDone = i / totalRecords;

            NSLog(@"%.1f Saving ...", self.percentDone * 100);


            NSError *error;
            if (![childContext save:&error]) {
                NSLog(@"\n error => %@ \n", [error localizedDescription]);
                NSLog(@" error => %@ ", [error userInfo]);
                [NSException raise:@"Database Write Error" format:@"%@ %@", [error localizedDescription], [error userInfo]];

                //                    abort();
            }

            [parentContext performBlock:^{
                NSError *errrror;
                if (![parentContext save:&errrror]) {
                    NSLog(@"\n error => %@ \n", [error localizedDescription]);
                    NSLog(@" error => %@ ", [error userInfo]);
                    [NSException raise:@"Database Write Error" format:@"%@ %@", [error localizedDescription], [error userInfo]];

                    //                        abort();
                }
            }];
        }

        //            }];

    }

子保存将其写入内存并实际写入磁盘,您必须调用父保存。如你所见,我一个接一个地做 - 但这不是必需的。