Подтвердить что ты не робот

Основные данные: Reset в исходное состояние

У меня есть объект, я вношу ему некоторые изменения, но я не хочу их сохранять, мне нужны "старые" значения.

Я пробовал:

[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

Должен ли я снова восстановить объект?

спасибо,

г.

4b9b3361

Ответ 1

Заверните изменения в NSUndoManager beginUndoGrouping, а затем a NSUndoManager endUndoGrouping, а затем NSUndoManager undo.

Это правильный способ отменить изменения. NSManagedObjectContext имеет свой собственный внутренний NSUndoManager, к которому вы можете получить доступ.

Пример обновления, показывающий

Так как NSUndoManager по умолчанию по умолчанию равен Cocoa Touch, вам нужно создать один и установить его в 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 аксессоры, тогда вы будете в порядке.

Ответ 2

Согласно документации Apple

Используя

- (void)rollback; 
[managedObjectContext rollback];

Удаляет все из стека отмены, отбрасывает все вставки и удаления и восстанавливает обновленные объекты до последних зафиксированных значений.

Здесь

Ответ 3

Попробуйте [managedObjectContext refreshObject:ingredient mergeChanges:NO] до второго вызова NSLog.