CoreData: очистить изменения от NSManagedObjectContext

Я создаю экземпляр объекта NSManagedObjectContext на уровне делегирования приложения и передавая его всем моим UIViewController s. Вот код, который я использую для доступа к нему в одном из моих контроллеров View:

        NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;
        modelObj = (Model *) [NSEntityDescription insertNewObjectForEntityForName:@"Model" inManagedObjectContext:[appDelegate managedObjectContext]];

Теперь на этом экране у меня есть UITableView с 9 строками, и каждая ячейка имеет UITextField. Когда пользователь вводит значения в текстовые поля, я назначаю их в modelObj. Теперь у моего пользователя есть возможность отменить и отменить все изменения или сохранить их на диск. У меня код сохранения работает нормально. Но в случае, когда пользователь пытается отказаться от изменений, я не уверен, что делать. Кажется, что не существует метода [managedObjectContext discardChanges], чтобы выбросить все это.

Я могу придумать пару способов решения этой проблемы.

  • Создайте новый экземпляр NSManagedObjectContext для каждого контроллера вместо совместного использования одного приложения.
  • Или я мог бы создать кучу NSString в своем коде и сохранить в нем значения пользователя и вызвать insertNewObjectForEntityForName: только в том случае, если пользователь нажимает на сохранение.

Какой путь правильный? Или есть способ сделать NSManagedObjectConext отменить все изменения, которые были сделаны для него?

Спасибо,
Тея.

Ответ 1

NSManagedObjectContext имеет простой способ для этого:

[managedObjectContext rollback];

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

Если мне что-то не хватает, это должно дать вам все, что вам нужно.

Ответ 2

Возможно, вы ищете -refreshObject:mergeChanges: - документы говорят, что он сбрасывает объект из постоянного хранилища, и если вы передаете NO как второй аргумент, вы можете отказаться от повторного внесения изменений, которые были сделаны.

Это, скорее всего, потребует сохранения набора объектов, которые вы изменили (для первого аргумента), затем очистите этот набор, когда вы вносите изменения в свой контекст в хранилище. Однако это должно быть довольно тривиальное дополнение.