我在核心数据数据库中有一些计算值,我需要在保存之前更新。基本上,我给一些实体编号是为了简化它们之间的导航。
目前我正在观察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
实例。
我猜你的编号影响了撤消堆栈。
我可能会尝试在NSManagedObject willSave
中处理这个问题,而不是使用NSManagedObjectContextWillSaveNotification
,但我怀疑这不会解决你的问题。
你可以试试:
[[self.managedObjectContext undoManager] disableUndoRegistration];
// do the renumbering
[self.managedObjectContext processPendingChanges];
[[self.managedObjectContext undoManager] enableUndoRegistration];
我使用它是为了避免在初始化期间弄脏一个全新的文档。我不确定它是否能正确地保存,但它可能值得一试。