10

Я создал два контекста, как это:Странный родитель/ребенок NSManagedObjectContext явление

// create writer MOC 
_privateWriterContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
[_privateWriterContext setPersistentStoreCoordinator:_persistentStoreCoordinator]; 

// create main thread MOC 
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
_managedObjectContext.parentContext = _privateWriterContext; 

У меня есть NSFetchResultedController инициированную _managedObjectContext.

Я знаю, что это странно, но я добавляю запись родителям к _privateWriterContext, я saving.

Удивительно, что детский контекст, и поэтому FRC получает уведомление об этом событии. Зачем? У меня нет reset -ed ребенок, или что-нибудь еще. Я думал, что они независимые объекты, пока детский контекст не будет сохранен.


В @pteofil статьи я нашел эту строку:

При внесении изменений в контексте, но не сохранены, он виден всем его потомков, но не к его предкам ,

.. он помещается в постоянное хранилище (через координатор постоянного хранилища) и становится видимым для всех контекстов, подключенных к хранилищу.

+2

Согласно этой статье http://benedictcohen.co.uk/blog/archives/308, это нормальное поведение. – pteofil

+1

И еще одна очень хорошая статья о производительности различных управляемых контекстных настроек: http://floriankugler.com/2013/04/29/concurrent-core-data-stack-performance-shootout/ – pteofil

+0

Я вижу, вы думаете, что это каким-то образом предотвратить распространение изменений в детский контекст? Я думал, что изменения не будут распространяться до тех пор, пока я не буду наблюдать «NSManagedObjectContextDidSaveNotification» и смените изменения из уведомления, если я использую два контекста, присоединяющихся к одной и той же конфигурации PSC. –

ответ

0

Этого не должно быть. Добавление NSManagedObject ('record') в parentContext не приведет к тому, что ребенок будет знать об этом объекте автоматически. Только когда вы делаете childContext для выполнения выборки, он будет извлекаться из parentContext. Чтобы выяснить, что происходит в вашем случае, вот несколько советов:.

  • фигура, когда выборка выполняется на childContext (это делается с помощью fetchedRestultsController, когда вы установите его Проверьте, что выборка происходит до или после добавления объекта managedObject в parentContext).
  • установить контрольные точки во всех четырех обратных вызовах делегата из fetchedResultsController, чтобы узнать, для какого объекта он вызывает методы (и посмотреть, является ли это объектом, который вы только что добавили в parentContext).
  • убедитесь, что вы знаете, в каком контексте вы также отправляете сообщения.

У меня есть использовал аналогичный подход, но разный: childContext контекст используется для анализа новых данных (на частную очереди), и когда это синтаксический сделано, чид звонки сохранить :. Это сохранит изменения до родителя, что в моем случае mainQueueContext. Этот вызов save: приведет к тому, что mainQueueContext получит все вновь обработанные объекты, и любой fetchedResultsController, использующий этот mainQueueContext, вызовет его методы делегирования для новых/измененных/обновленных/удаленных объектов. Вы также можете попробовать инвертировать отношения между дочерним и родительским отношением и посмотреть, работает ли он, как описано в документах, чтобы узнать, что происходит.

0

Я настоятельно рекомендую избегать установки родительского и дочернего контекстов. Наша книга подробно рассказывает о том, почему они часто приводят к странному поведению: https://www.objc.io/books/core-data/

Рассказ: они не так независимы, как вы думаете.

Используйте несколько контекстов, в которых используется один постоянный координатор хранилища, если вам нужно больше одного контекста.

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