Редактирование NSManagedObject в дублированном контексте для последующего слияния - PullRequest
0 голосов
/ 21 апреля 2011

Когда пользователь дважды нажимает на представление в моем приложении, контроллер uipopover предоставляет ему поля, которые он может редактировать.(Очень похоже на приложение календаря для iPad)

Представление представляет собой объект NSmanagedobject.Чтобы иметь возможность отменить операции, выполняемые в контроллере uipopover, моя идея заключалась в следующем:

1) создать «editManagedObjectContext» в моем viewcontroller для всплывающего окна и дать ему постоянный координатор хранилища моего основного контекста, используемого в моем приложении.

editContext = [[NSManagedObjectContext alloc] init];
[editContext setPersistentStoreCoordinator:[myContext persistentStoreCoordinator]];

2) извлечь объект, представленный в повернутом виде (Задача *), из нового "editContext"

task = [editContext objectWithID:[taskOrNilForNewTask objectID]];

3) Используйте эту задачу, чтобы выполнить все редактирование и когдапользователь завершает, он может либо:

  1. Отменить всю операцию редактирования.Это просто отбрасывает editContext и возвращает.
  2. Сохранить.Это могло бы объединить editcontext с исходным контекстом через mergeChangesFromContextDidSaveNotification :. Таким образом, зафиксировав изменения в соответствующей задаче в исходном контексте.

Проблема в том, что task = [editContext objectWithID:[taskOrNilForNewTask objectID]]; приводит к поврежденному объекту.И позже, когда я пытаюсь получить доступ к свойствам объекта задачи, я получаю либо ошибку BAD_EXC, либо мой объект задачи, кажется, имеет какой-то странный тип в диапазоне от: CALayer, NSCFData, ...

Моя мысль былачто мне, возможно, придется сначала сохранить исходный контекст, но это приводит к примерно таким же ошибкам.Но так как я сохранил непосредственно перед созданием editContext, я подумал, что операция сохранения может быть выполнена в другом потоке, и это может быть причиной?

Я просто не могу понять, что я делаю неправильно, инадеюсь, что вы, ребята, можете дать какой-нибудь совет.

Мой подход был основан на подходе из примера кода CoreDataBook от Apple (rootviewcontroller.m - (IBAction) addBook:)

1 Ответ

1 голос
/ 21 апреля 2011

Ваша проблема заключалась в том, что objectWithID: возвращает автоматически выпущенный объект, который вы затем сохраняли в иваре, не сохраняя его. Позже система освободила его, и вы либо попали в мусор, который дает вам EXC_BAD_ACCESS, либо вы попали по совпадению с другим объектом в том же месте памяти. Описанные вами ошибки прояснили это.

Причина, по которой self.task исправляет это, заключается в том, что свойство self.task объявляется как сохраняемое, поэтому при присваивании через свойство автоматически сохраняется необходимое сохранение. Обратите внимание, что если вы не отпустите его в dealloc, то у вас будет утечка памяти.

...