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

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

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

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

[mainContext mergeChangesFromContextDidSaveNotification:syncFinishedNotification];

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

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

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

Есть идеи?

1 ответ

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

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

Другие вопросы по тегам