【发布时间】:2012-02-12 21:38:23
【问题描述】:
我的 iPad 应用程序(一个 OpenGL 绘图应用程序)中有一个有点复杂的数据模型,我正在努力实现撤消/重做功能。我喜欢 Core Data 将免费撤消数据模型更改这一事实,但我不知道内置功能是否足以满足我的需求。
我已经看到很多在绘图应用程序中实现撤消/重做的示例,但它们通常执行以下操作:
- 将托管对象上下文告诉
undo。 - 从更改的数据模型中重新绘制页面上的所有内容。
这非常低效 - 在我的应用程序中,我需要能够根据正在“撤消”的特定对象执行撤消操作,这通常意味着只刷新画布的一部分。
所以我的问题是:我可以注册自己的撤消操作并将其与内置撤消操作一起使用吗?例如,假设我在用户画线时执行以下操作:
- (void)drawLineFromPoint:(CGPoint)startPoint toPoint:(CGPoint)endPoint
{
// Register the undo operation.
[[[managedObjectContext undoManager] prepareWithInvocationTarget:self]
removeObjectWithIndex:nextObjectIndex];
// Draw the line object.
[self drawLineObjectWithIndex:nextObjectIndex fromPoint:startPoint toPoint:endPoint];
// Save the new object to the data model.
[MyCoreDataHelper saveLineObjectWithIndex:nextObjectIndex fromPoint:startPoint toPoint:endPoint];
nextObjectIndex++;
}
当我要撤消此操作时,会触发调用并适当地更改模型吗?或者这种情况是否需要我放弃内置的托管对象上下文撤消系统并仅使用NSUndoManager 自己滚动,包括自己删除和编辑数据模型?除非我能分辨出内置的撤消/重做实际上是在撤消什么,否则看起来这可能会变得非常混乱和复杂......
编辑:我怀疑(如果上面的想法可行)我需要将它包装到一个撤消组中,以便我注册的撤消操作将与数据模型更改一起分组?
另一个编辑: 另外,我可以保证撤消操作的执行顺序吗?换句话说,如果我在保存核心数据更改并注册我的撤消操作后调用undo,我能否确保在调用我的撤消操作之前恢复已删除的实体?
【问题讨论】:
-
如果只需要刷新部分画布,不能用-(void)setNeedsDisplayInRect:(CGRect)invalidRect
-
不,有很多原因。首先,我的绘图是使用 OpenGL 完成的。此外,绘图操作涉及查找每个点精灵位置的冗长计算,即使我为每个绘图笔画预先计算了这些,渲染整个屏幕的所有笔画也可能需要很长时间。您是否知道是否可以识别撤消更改了哪些数据?感谢您的建议。
标签: ios core-data nsmanagedobjectcontext undo-redo