performBlock中保存子数据库的核心数据:删除撤消堆栈

时间:2013-03-15 11:09:31

标签: ios objective-c core-data nsundomanager uimanageddocument

我正在制作一个绘图应用。每次点击都会创建一些核心数据实体。用户可以点击撤消按钮,这些点击一次撤消一次。这很好。

运行某些自动化任务时会出现问题。我有一个按钮,在子上下文中创建一堆核心数据实体(自己绘制一些东西),然后保存上下文,以便更改反映在主上下文中。

问题在于用户点击任务按钮的次数无关紧要,所有更改都会分组到一个撤消步骤中。

说清楚:他做了5个任务,然后点击撤消一次,他回到了开头。但我希望他能够一次撤销一项任务。

我正在使用UIManagedDocument和它的核心数据堆栈。所以它是2个上下文,一个写入磁盘,一个用于一般用途的子项,然后我为后台操作创建后者的子项。

这是我的代码:

NSManagedObjectContext* childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
childContext.parentContext = self.document.managedObjectContext;
childContext.undoManager = self.document.undoManager;
[childContext performBlock:^{

    //a lot of things happen here, that generate many entities

    [childContext save:nil];

    [self.document.managedObjectContext performBlock:^{

        //completion stuff, update UI...

    }];
}];

1 个答案:

答案 0 :(得分:0)

一个想法是将每个要在其自己的块中可撤消的代码块(具有相同的子上下文)括起来。也许开始把它分成两个块,看它是否有效。

第二个想法,我认为每个保存都不是真正的保存,而只是将更改推送到父上下文。所以我的猜测是父上下文将每个子节点注册为一个可撤销事件。也许你可以尝试更频繁地保存,然后看看这些块是否可以撤消。