我正在制作一个绘图应用。每次点击都会创建一些核心数据实体。用户可以点击撤消按钮,这些点击一次撤消一次。这很好。
运行某些自动化任务时会出现问题。我有一个按钮,在子上下文中创建一堆核心数据实体(自己绘制一些东西),然后保存上下文,以便更改反映在主上下文中。
问题在于用户点击任务按钮的次数无关紧要,所有更改都会分组到一个撤消步骤中。
说清楚:他做了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...
}];
}];
答案 0 :(得分:0)
一个想法是将每个要在其自己的块中可撤消的代码块(具有相同的子上下文)括起来。也许开始把它分成两个块,看它是否有效。
第二个想法,我认为每个保存都不是真正的保存,而只是将更改推送到父上下文。所以我的猜测是父上下文将每个子节点注册为一个可撤销事件。也许你可以尝试更频繁地保存,然后看看这些块是否可以撤消。