Сброс контекста управляемого объекта не работает - PullRequest
1 голос
/ 09 декабря 2011

У меня есть основной контекст управляемого объекта (MOC) в потоке пользовательского интерфейса, который обычно обновляется рабочими потоками.Работает нормально!

Однако у меня есть одно представление, где я создаю другой MOC (называемый editMOC) в потоке пользовательского интерфейса.Я читаю myObject через objectID в редактировании MOC.После этого я делаю некоторые модификации объекта myObject в редактировании MOC.Если пользователь нажмет cancel, произойдет следующее:

[self.editingMOC reset];

myObjectEdit = [self.editingMOC existingObjectWithID:myObject.objectID error:NULL];

Разве это не должно восстановить myObjectEdit в его прежнее состояние?Я не позвонил сохранить.Тем не менее myObjectEdit все еще имеет мои изменения.Любая идея, что может быть не так?

Спасибо!


Обновление:

Видимо, обновление myObjectEdit правильно (спасибо Марк Адамс).Я отследил это до странного поведения:

// RESET VALUE - OK
NSLog(@"%@", myEditObject);

self.tableView.userInteractionEnabled = NO;

// OLD VALUE AGAIN - WRONG
NSLog(@"%@", myEditObject);

Я ничего не изменил относительно userInteractionEnabled.Есть ли у этого метода побочные эффекты, не указанные в документации?

1 Ответ

1 голос
/ 09 декабря 2011

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

[self.editingMOC refreshObject:myObject mergeChanges:NO];

Ссылка на класс NSManagedObjectContext - refreshObject:mergeChanges:

Редактировать : Из вашего вопроса кажется, что вы можете передавать объекты между потоками. В этом случае обязательно создайте объект по идентификатору объекта вместо ссылки на объект в потоках. Я предполагаю, что вы уже знаете это, хотя ...

...