У меня есть объект, я вношу некоторые изменения в него, но я не хочу сохранять их, я хочу 'старые' значения.
Я попробовал:
[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
Я должен повторно выбрать объект снова?
спасибо,
r.
Оберните свои изменения в NSUndoManager beginUndoGrouping
, а затем в NSUndoManager endUndoGrouping
с последующим NSUndoManager
.
Это правильный способ отката изменений. NSManagedObjectContext
имеет свой собственный внутренний NSUndoManager
, к которому вы можете получить доступ.
Поскольку NSUndoManager
по умолчанию равен нулю в Cocoa Touch, вам необходимо создать один и сначала установить его в NSManagedObjectContext
.
//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
, то все будет в порядке.
Попробуйте [managedObjectContext refreshObject: ингредиент mergeChanges: NO]
до второго вызова NSLog
.