Объединение контекстов нескольких дочерних управляемых объектов

В моем приложении для iOS я пытаюсь синхронизировать основные данные с веб-сервером. Я хочу использовать отдельный фоновый контекст управляемого объекта для синхронизации, чтобы я мог оставить свой основной контекст свободным, чтобы принимать изменения из пользовательского интерфейса во время обработки синхронизации. Оба контекста являются потомками моего контекста записи на диск согласно этому сообщению в блоге http://www.cocoanetics.com/2012/07/multi-context-coredata/.

У меня вопрос: как объединить оба дочерних контекста перед сохранением на диск?

Если я подпишусь на contextDidSaveNotifications, я могу объединить контексты, используя

[mainContext mergeChangesFromContextDidSaveNotification:syncFinishedNotification];

но согласно документации ... «Этот метод обновляет все объекты, которые были обновлены в другом контексте, ошибки в любых вновь вставленных объектах и ​​вызывает deleteObject :: для тех, которые были удалены».

Я не хочу обновлять обновленные объекты и терять изменения, внесенные в mainContext, а хочу объединить оба набора изменений.

Я новичок в мульти-контекстных основных данных, поэтому могу думать об этом неправильно.

Любые идеи?


person adamF    schedule 28.10.2013    source источник


Ответы (1)


Слияние изменений в Core Data - это всегда процесс внесения изменений в один контекст управляемого объекта и их последующего применения к другому контексту. Если оба контекста могут получать новые изменения одновременно, на слияние влияет политика слияния контекста. Если нет конфликтующих изменений, беспокоиться не о чем. Однако, если они есть, вам нужно выбрать подходящую политику слияния.

Если вы ничего не делаете, значение по умолчанию - NSErrorMergePolicyType, что означает, что сохранение изменений не удастся после объединения изменений. Вы почти наверняка этого не хотите. Но есть и другие предопределенные политики на выбор. NSMergeByPropertyObjectTrumpMergePolicyType здесь часто бывает хорошим выбором, потому что дает приоритет несохраненным конфликтующим изменениям. Поэтому, если контекст синхронизации вносит конфликтующие изменения в объект, который редактирует пользователь, изменения пользователя сохраняются. Есть еще несколько консервированных вариантов. Если ни один из них не подходит, вы всегда можете создать подкласс NSMergePolicy и делать все, что захотите. Однако это редко необходимо.

person Tom Harrington    schedule 28.10.2013
comment
Спасибо, это именно то, что я искал. Прочитав еще немного, мне кажется, что мне даже не нужно использовать mergeChangesFromContextDidSaveNotification. Если я сохраню дочерние контексты, все изменения будут объединены в родительский с использованием NSMergePolicy, который я укажу. Это правильное понимание? - person adamF; 29.10.2013
comment
@adamF Я тоже почувствовал, что ваше понимание правильное после нескольких обсуждений в переполнении стека, хотя это не подтверждено / не задокументировано. даже не нужно использовать mergeChangesFromContextDidSaveNotification. Если я сохраню дочерние контексты, все изменения будут объединены в родительский с использованием NSMergePolicy, который я указал. Вы подтвердили правильность нашего предположения? - person Dinakar; 20.08.2014