我有一个对象,我对它进行了一些更改,但我不想保存它们,我想要'旧'值。
我试过了:
[managedObjectContext rollback];
[managedObjectContext redo];
[managedObjectContext reset];
并且它们似乎都不起作用......
NSLog(@"current: %@",ingredient.name); // ===> bread
[ingredient setName:@"test new data"];
NSLog(@"new: %@",ingredient.name); // ===> test new data
[managedObjectContext rollback];
[managedObjectContext redo];
[managedObjectContext reset];
NSLog(@"current: %@",ingredient.name); // ===> test new data
// I want again ===> bread
我应该再次重新获取对象吗?
感谢,
河
答案 0 :(得分:24)
将更改换成NSUndoManager beginUndoGrouping
,然后换取NSUndoManager endUndoGrouping
后跟NSUndoManager undo
。
这是回滚更改的正确方法。 NSManagedObjectContext
有自己的内部NSUndoManager
,您可以访问。
由于Cocoa Touch默认情况下NSUndoManager
为零,您必须创建一个并将其设置为NSManagedObjectContext first
。
//Do this once per MOC
NSManagedObjectContext *moc = [self managedObjectContext];
NSUndoManager *undoManager = [[NSUndoManager alloc] init];
[moc setUndoManager:undoManager];
[undoManager release], undoManager = nil;
//Example of a grouped undo
undoManager = [moc undoManager];
NSManagedObject *test = [NSEntityDescription insertNewObjectForEntityForName:@"Parent" inManagedObjectContext:moc];
[undoManager beginUndoGrouping];
[test setValue:@"Test" forKey:@"name"];
NSLog(@"%s Name after set: %@", __PRETTY_FUNCTION__, [test valueForKey:@"name"]);
[undoManager endUndoGrouping];
[undoManager undo];
NSLog(@"%s Name after undo: %@", __PRETTY_FUNCTION__, [test valueForKey:@"name"]);
另外,请确保您的访问者遵守KVO规则并发布-willChange:
,-didChange:
,-willAccess:
和-DidAccess:
通知。如果你只是使用@dynamic
访问者,那么你会没事的。
答案 1 :(得分:4)
根据Apple的文档
使用
- (void)rollback;
[managedObjectContext rollback];
从撤消堆栈中删除所有内容,放弃所有插入和删除,并将更新的对象恢复为其上次提交的值。
答案 2 :(得分:2)
在第二次[managedObjectContext refreshObject:ingredient mergeChanges:NO]
来电之前尝试NSLog
。