2013-03-15 56 views
0

我正在制作一个绘图应用程序。每次点击都会创建一些核心数据实体。用户可以按下撤消按钮,并且这些点击一次就被撤消。这工作正常。在performBlock中的核心数据保存子上下文:删除撤消堆栈

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

问题在于用户点击任务按钮的次数并不重要,所有更改都分组为一个撤消步骤。

要说清楚:他完成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

你描述的正是我想要的:每个子上下文保存为一个可撤销事件。但它不是那样工作的。随着每个孩子的保存,它将所有以前的操作分组到一个可撤消的事件中,使文档恢复到打开时的状态。 – Odrakir 2013-03-16 09:10:37

+0

那么?您是否尝试过创建独立上下文的第一个策略? – Mundi 2013-03-16 13:06:48

+0

如果我理解你是对的,那就是我正在做的。我想要撤消的每个代码块都在它自己的performBlock函数中。它不起作用。 – Odrakir 2013-03-18 16:53:39