Слияние нескольких дочерних контекстов управляемого объекта
В моем приложении для iOS я пытаюсь синхронизировать данные ядра с веб-сервером. Я хочу использовать отдельный фоновый контекст управляемого объекта для синхронизации, чтобы я мог оставить свой основной контекст свободным для принятия изменений от пользовательского интерфейса во время обработки синхронизации. Оба контекста являются детьми моего контекста записи на диск согласно этому сообщению в блоге http://www.cocoanetics.com/2012/07/multi-context-coredata/.
У меня вопрос: как объединить оба дочерних контекста перед сохранением на диск?
Если я подписываюсь на contextDidSaveNotifications, я могу объединить контексты, используя
[mainContext mergeChangesFromContextDidSaveNotification:syncFinishedNotification];
но согласно документации... "Этот метод обновляет любые объекты, которые были обновлены в другом контексте, сбои во всех вновь вставленных объектах и вызывает deleteObject:: для тех, которые были удалены."
Я не хочу обновлять обновленные объекты и терять изменения, внесенные в mainContext, а скорее объединить оба набора изменений.
Я новичок в многоконтекстных основных данных, поэтому я могу думать об этом неправильно.
Есть идеи?
1 ответ
Объединение изменений в Базовых данных - это всегда процесс принятия изменений в одном контексте управляемого объекта и последующего их применения в другом контексте. Если оба контекста могут получить новые изменения одновременно, на слияние влияет политика слияния контекста. Если нет противоречивых изменений, не о чем беспокоиться. Если это возможно, вам нужно будет выбрать соответствующую политику слияния.
Значение по умолчанию, если вы ничего не делаете NSErrorMergePolicyType
, что означает, что сохранение изменений не будет выполнено после объединения изменений. Вы почти наверняка не хотите этого. Но есть и другие предопределенные политики на выбор. NSMergeByPropertyObjectTrumpMergePolicyType
часто является хорошим выбором, потому что отдает приоритет несохраненным конфликтующим изменениям. Таким образом, если контекст синхронизации вносит противоречивые изменения в объект, который редактирует пользователь, изменения пользователя сохраняются. Есть несколько других консервированных вариантов. Если ни один из них не подходит, вы всегда можете подкласс NSMergePolicy
и делай что хочешь. Это редко необходимо, хотя.