1

У меня есть 2 контекста NSManagedObject, один временный и другой, который является первичным. Временный контекст имеет свой родительский контекст, заданный в основном контексте. Я использую их оба в следующих случаях:NSManagedObjectContext Child/Parent - Ребенок не удаляет зарегистрированные объекты

  • Когда я создаю «новый» объект, я создаю новый с временным контекстом. Если пользователь нажимает «отменить» и решает не создавать новый объект, я просто удаляю объект из контекста управляемого объекта и сохраняю этот контекст.
  • Если пользователь сохраняет этот новый объект, я сохраняю временный контекст, а затем сохраняю основной контекст для сохранения этих изменений. Я использую методы «performBlock» и объединяю их, как это рекомендуется для Apple и других сообщений Stackoverflow.
  • Если я редактирую существующий объект, я сохраняю его в основном контексте во время редактирования. Если пользователь нажимает «cancel», я вызываю «откат» в основном контексте, который отбрасывает все изменения.

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

Однако существует случай, когда создание «нового» объекта включает в себя другой объект, который имеет отношение к этому новому объекту. Поэтому для этого объекта я создаю новый объект, создаю «дочерний» объект и устанавливаю его на родителя. Итак, есть 2 NSManagedObjects. Я выполняю «сохранение» таким же образом - временный контекст сохраняется, а затем первичный сохраняется после. Проблема заключается в том, что мой временный контекст все еще утверждает, что после завершения сохранения у него есть 2 зарегистрированных объекта. Основной объект также указывает, что он имеет 2, и все они отображаются правильно.

Я могу исправить это, выполнив «сброс» во временном контексте после выполнения «сохранения» во временном контексте. Однако это просто не кажется правильным. Зачем мне это делать? Почему мой временный контекст все еще регистрирует зарегистрированные объекты даже после выполнения сохранения?

EDIT: Я также могу исправить это, выполнив «refreshObject: object mergeChanges: NO» на объекте из временного контекста после выполнения сохранения во временном контексте. На данный момент это похоже на решение (пока кто-нибудь не сможет объяснить, зачем мне это нужно или почему это происходит). Я предполагаю, что объекты ссылаются друг на друга, что заставляет объекты не выпускать.

ответ

0

Когда вы выполняете операцию сохранения на MOC, он сохранит объект в родительском MOC постоянного хранилища. Но объект по-прежнему будет сохранен MOC в памяти.

По умолчанию ссылки между управляемым объектом и его контекстом являются слабыми. Исключение из этого правила заключается в том, что контекст управляемого объекта поддерживает сильную ссылку на любые измененные (вставленные, удаленные и обновленные) объекты до тех пор, пока не будет выполнена ожидающая транзакция (с сохранением :) или сбрасывается (с сбросом или откатом).

Если вы чувствуете, что этот объект больше не нужен для текущего будущего, или генерируются сигналы тревоги («на лету» в памяти), вы хотели бы обрезать объект графика, превратив каждую вещь в неисправность, используя «refreshObject» : object mergeChanges: NO "

+0

Кажется, что выполнение «refreshObject» или «refreshAllObjects» не вызывает негативных последствий для моего приложения. Как только «сохранение» происходит в основном контексте, мой обработчик получаемых результатов уведомляется об изменении успешно (с или без очистки временного контекста). Кажется, что выполнение обновления - мой лучший вариант. – CoBrA2168

+0

Обновляемые объекты, в зависимости от вашего интервала времени, заставляют Core Data снова попадать в магазин. При вызове refresh появляется эффект производительности, и его следует использовать экономно. Core Data очень хорош в управлении собственной памятью. Примите участие только в том случае, если у вас есть проблемы с производительностью. –

+0

Пока нет реальной проблемы с производительностью, просто пытаясь предотвратить ее появление в будущем. Я начал исследовать это и изменить модель Core Data при использовании инструментов - я заметил, что удаленные NSManagedObjects остались в памяти. Я не мог найти никаких конкретных доказательств или документации, в которых говорилось, что это ожидаемое поведение. – CoBrA2168

0

Почему вы решили написать письмо на вопрос о количестве зарегистрированных объектов? Зарегистрированные объекты - это просто список объектов, о которых знает контекст. Поскольку этот контекст создал эти объекты, он, естественно, продолжал бы знать о них даже после сохранения. Core Data не очищает объекты после сохранения.

Читает, что он работает по назначению.

+0

См., я не был уверен, было ли это предполагаемое поведение или нет. Кажется, что что-то не так, что даже после выполнения операции «удалить» на рассматриваемых объектах временный контекст все еще утверждает, что он имеет эти зарегистрированные объекты в памяти. – CoBrA2168

+0

Да, и он будет сохранять их в течение определенного периода времени. Если у вас нет особых причин для доступа к зарегистрированным объектам, это действительно не имеет большого значения в повседневных операциях. Это похоже на «-retainCount» в тот же день, что-то звучит полезно, но в конечном итоге не имеет ценности для «нас» (разработчиков, отличных от Apple). –

Смежные вопросы