Консоль содержимого управляемого управляемого объекта объекта всегда совпадает с содержимым этого родителя?
Как обновить контекст дочернего управляемого объекта, чтобы он имел те же данные с родителем?
Насколько я знаю, при сохранении ребенок только идет один шаг, а именно к родителям. Тем не менее, когда выборка извлечения всегда идет очень глубоко до родительского и постоянного хранилища. Поэтому я ожидаю, что все будет одинаково.
Но это не так.
У меня есть контекст управляемого объекта, который является родительским для всех других контекстов управляемого объекта.
Один ребенок изменит данные и сохранит их. Родитель также изменен. Я выполняю 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 отображал информацию об обновлении. Интересно, что такое стандартное решение.
Ответы
Ответ 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 для этой цели может сэкономить вам большую боль, поскольку оно наилучшим образом использует кеш-строку контекста управляемого объекта. Он также будет проходить только по стопке детей и родителей, чтобы удовлетворить запрос.