使用NSPersistentDocument撤消管理器不是最新的

时间:2011-10-09 15:18:37

标签: cocoa nsmanagedobjectcontext nsundomanager nspersistentdocument

我在核心数据库中有一些计算值,我需要在保存之前更新。基本上我正在为一些实体编号,以便简化它们之间的导航。

目前我正在观察NSManagedObjectContextWillSaveNotification并试图在那里进行编号。似乎我所做的更改已保存,但撤消管理器似乎仍有一些修改。这使得文档看起来有变化(关闭按钮上的标记),即使托管对象上下文说它没有(hasChanges)。如果我撤消一次,文档看起来没有任何变化,反过来,托管对象上下文会这样做。

撤销管理器是否以某种方式将自己重置在错误的位置或我做错了什么?

更新

我正在进行重新编号的有点混淆的代码看起来像这样:

- (void)managedObjectContextWillSave:(NSNotification *)notification
{
    // Force the content view controller to save any pending changes.
    [_contentViewController saveChanges];

    NSArray *itemSortDesc = [self sortDescriptorsForSomeItem];
    NSArray *items = [SomeItem findAllObjectsInContext:self.managedObjectContext
                                             andSortBy:itemSortDesc];
    NSUInteger i = 0;
    for (SomeItem *i in items)
    {
        i.uid = [NSNumber numberWithUnsignedInteger:i++];
    }
}

_contentViewController包含一个文本字段,该字段将被解析为SomeItem的多个实例。

1 个答案:

答案 0 :(得分:0)

我猜你的编号会影响撤销堆栈。

我可能会尝试在NSManagedObject willSave中处理此问题,而不是使用NSManagedObjectContextWillSaveNotification,但我怀疑这不会解决您的问题。

你可以试试这个:

[[self.managedObjectContext undoManager] disableUndoRegistration];

// do the renumbering

[self.managedObjectContext processPendingChanges];
[[self.managedObjectContext undoManager] enableUndoRegistration];

我使用它来避免在初始化期间弄脏一个全新的文档。我不确定它是否能正常用于保存,但它可能值得尝试。