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

Консоль содержимого управляемого управляемого объекта объекта всегда совпадает с содержимым этого родителя?

Как обновить контекст дочернего управляемого объекта, чтобы он имел те же данные с родителем?

Насколько я знаю, при сохранении ребенок только идет один шаг, а именно к родителям. Тем не менее, когда выборка извлечения всегда идет очень глубоко до родительского и постоянного хранилища. Поэтому я ожидаю, что все будет одинаково.

Но это не так.

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

Один ребенок изменит данные и сохранит их. Родитель также изменен. Я выполняю executeFetchRequest для родителя, и я вижу, что данные изменяются.

Однако некоторые дочерние родители по-прежнему используют старые данные. Тот же самый объект id одинаковых данных. Как-то значение свойства остается неизменным.

Как сообщить ребенку перезагрузить свежие данные от родителя?

Более точно

Скажем, P является родительским

Предположим, что он имеет C1 C2 C3 как дочерний

Затем C1 изменяет данные и фиксирует. Изменение распространяется на P. Однако выполнение executeFetchRequest на C2 и C3 по-прежнему показывает старые данные.

Что дает?

Например, когда я проверяю свойство imageBlob, это то, что я получаю:

Ребенок:

2013-02-05 13:57:42.865 BadgerNew[78801:c07] imageBlob: <UIImage: 0x89c3c50>
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null>
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null>
2013-02-05 13:57:42.866 BadgerNew[78801:c07] imageBlob: <null>

Родитель:

2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x114af650>
2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x8e492e0>
2013-02-05 13:57:42.868 BadgerNew[78801:c07] imageBlob: <UIImage: 0x114c79b0>
2013-02-05 13:57:42.869 BadgerNew[78801:c07] imageBlob: <UIImage: 0xa8c76e0>

Вот более полная версия, почему я записываю moc, родительский moc, blob, URL и идентификатор объекта. Ребенок:

В частности, я хочу, чтобы контекст управляемых объектов mainqueue был другим дочерним элементом родительского объекта, а не родителем для всех других управляемых объектов. С другой стороны, я также хочу, чтобы контекст mainQueue Managed отображал информацию об обновлении. Интересно, что такое стандартное решение.

4b9b3361

Ответ 1

У ребенка есть недопустимые существующие ссылки. Если вы хотите, чтобы братья и сестры синхронизировались после сохранения родителя, вы должны аннулировать детей с помощью reset.

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

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

Ответ 2

На самом деле существует много документации о том, как это сделать правильно, в том числе видеоролики сессии WWDC с 2011 года и 2012 года. Для вас будет особенно интересна сессия 214 "Основные рекомендации по основным данным".

Например, для вашего сохранения это должно выглядеть так:

 [child performBlock:^{
     [child save:&error];
     [parent performBlock:^{
         [parent save:&parentError];
     }];
 }];

Это сохраняет ребенка, изменения переходят к родительскому элементу и сохраняются на родительском объекте - который будет правильно распространять все эти изменения в других дочерних контекстах. Рассматривая ваш вопрос, я думаю, что вы можете столкнуться с некоторыми другими проблемами с вашей реализацией, а Session 214 может быть очень полезен при их разрешении.

Что касается сброса контекста, я бы не рекомендовал это делать при использовании родительских контекстов. Я также избегаю использования refreshObject:mergeChanges:. Использование objectWithID для этой цели может сэкономить вам большую боль, поскольку оно наилучшим образом использует кеш-строку контекста управляемого объекта. Он также будет проходить только по стопке детей и родителей, чтобы удовлетворить запрос.