Как установить отношение от одного NSManageObject к другому в другом NSManagedObjectContext - PullRequest
1 голос
/ 01 декабря 2011

Поскольку мое приложение является многопоточным, я использую два NSManagedObjectContexts. Основной контекст, который запускается в основном потоке, и другой контекст, который выполняется только в отдельном потоке.

Я создал небольшое тестовое приложение. У него есть два основных объекта данных. Родитель и ребенок. Родитель имеет отношение один-ко-многим с ребенком. Ребенок имеет отношение 1-1 к родителю.

В одном методе тестирования (который выполняется в отдельном потоке) я получаю экземпляр Parent, который был создан во время выполнения ранее. Так что это в основном контексте. Я получаю этого родителя с этой строкой кода:

Parent *tmpParent = [[parentController selectedObjects] objectAtIndex:0];

Затем я создаю несколько дочерних элементов в контексте потока ( managedObjectContextInBackground ), устанавливаю для их родителя значение tmpParent, даю им имя и сохраняю контекст потока:

Child *child1 = (Child *)[NSEntityDescription insertNewObjectForEntityForName:@"Child" inManagedObjectContext:managedObjectContextInBackground];
[child1 setName:@"Homer"];
[child1 setParent:tmpParent];

Child *child2 = (Child *)[NSEntityDescription insertNewObjectForEntityForName:@"Child" inManagedObjectContext:managedObjectContextInBackground];
[child2 setName:@"Wilma"];
[child2 setParent:tmpParent];

[self saveManagedObjectContextInBackground];

Если я выполняю этот метод, приложение вылетает и говорит: Незаконная попытка установить «родительскую» связь между объектами в разных контекстах

Вот почему я добавил эту строку ниже объявления tmpParent:

[managedObjectContextInBackground insertObject:tmpParent];

Но приложение снова вылетает, говоря: NSManagedObject может быть только (или наблюдаться) одним NSManagedObjectContext

Я просмотрел документацию, но не смог найти способ решить эту проблему.

Вопрос: Как я могу установить отношение Child к Parent, когда Parent находится в другом NSManagedObjectContext, чем Child ??

1 Ответ

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...