在UIManagedDocument上自动保存不使用NSUndoManager

时间:2013-03-05 05:08:46

标签: ios nsundomanager uimanageddocument

分辨率

NSUndoManager只能在子NSManagedObjectContext中使用(与Core Data一起使用时)。这是因为UIManagedDocument可以在任何时间点自动保存,之后undo将无效。因此,使用NSUndoManager来实现保存/取消功能是没有意义的,因为子上下文会给你相同的结果。

真的很可悲,因为NSUndoManager比子上下文更容易实现(后者我必须调用existingObjectWithID将对象从父项复制到子项 - 痛苦)。我个人认为如果groupingLevel != 0该文档不应该自动保存。兰特完成了。

原始问题

我有一个表视图控制器,它使用Core Data将数据加载到UIManagedDocument。它将转换为视图控制器以编辑表中的每一行。在该视图控制器中,我有取消和保存按钮。我正在使用NSUndoManager通过我的NSManaged对象(下面self.list)上的类别实施取消功能。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.list beginEdit];
}

- (IBAction)cancel:(id)sender
{
    [self.list cancelEdit];
    [self close];
}

- (IBAction)save:(id)sender
{
    [self.list endEdit];
    [self close];
}

该类别实现beginEditendEditcancelEdit,用于处理NSUndoManager内容。在下面的代码中,useUndo是一个常量,我设置为NO或YES以查看使用NSUndoManager的影响。

- (void)beginEdit
{
    if (useUndo)
    {
        NSUndoManager *undoManager = [[NSUndoManager alloc] init];
        self.managedObjectContext.undoManager = undoManager;
        [undoManager beginUndoGrouping];
    }
}

- (void)endEdit
{
    [self.managedObjectContext save:nil];
    if (useUndo)
    {
        NSUndoManager *undoManager = self.managedObjectContext.undoManager;
        [undoManager endUndoGrouping];
        self.managedObjectContext.undoManager = nil;
    }
}

- (void)cancelEdit
{
    if (useUndo)
    {
        NSUndoManager *undoManager = self.managedObjectContext.undoManager;
        [undoManager endUndoGrouping];
        [undoManager undo];
    }
}

我可以看到Core Data调试消息显示如果保存对象并在useUndo = NO时单击主页按钮,则提交更改。但是,使用useUndo = YES时,单击“主页”按钮时不会自动保存。我等了几分钟,它仍然没有自动保存。有什么方法可以强制自动保存吗?

有人可以解释为什么使用undoManager会导致行为发生这种变化吗?

我怀疑要么是以错误的方式解决这个问题,要么在代码中遇到一些简单的问题。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我不确定它是否正确但是stackoverflow上的其他答案已经提到NSUndoManager在上下文保存时清除撤消堆栈。这意味着使用具有自动保存功能的撤消管理器最多只需几秒钟(无论自动保存间隔是多少)。那里可能有联系,我正在努力寻找更多......