Swift: реализация настраиваемой политики слияния - PullRequest
0 голосов
/ 19 июня 2020

Я создаю приложение OSX с использованием Swift с Coredata в качестве уровня данных. В рамках этого у меня есть таблица, в которой перечислено большое количество файлов, с каждым из которых связаны метаданные. Каждая запись может включать URI, который указывает на одну из трех служб, на которых она может быть размещена.

1. title   created_at   size   uuid   source_local   source_remote   source_cloud

Я генерирую все записи, используя информацию, полученную из локального источника. Все эти записи содержат строку source_local.

Позже я импортирую несколько записей из удаленного источника. Все эти записи добавляются и имеют строку source_remote.

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

Я пробовал:

NSMergeByPropertyStoreTrumpMergePolicy и NSMergeByPropertyObjectTrumpMergePolicy

Но эти политики приводят к тому, что одна запись полностью превосходит другую.

В настоящее время мне нужно обойти это ограничение, проверяя, существует ли уже запись с UUID, и обновляя существующая запись с отсутствующими полями в новом файле.

Однако это кажется неоптимальным - есть ли способ создать собственную политику слияния, чтобы Swift автоматически обрабатывал конфликты таким образом? На этом этапе меня не волнует, превосходит ли запись Store или Memory другую, если я могу правильно объединить поля source_*.

Спасибо

1 Ответ

0 голосов
/ 21 июня 2020

Прежде всего, спасибо @ tom-harrington за его кивок на расширение NSMergePolicy. Я очень внимательно следил за тем, чтобы даже не подумать о том, чтобы пойти по этому пути.

Однако, исследуя, как реализованы NSMergeByPropertyStoreTrumpMergePolicy / NSMergeByPropertyObjectTrumpMergePolicy, я понял, что эта проблема возникла из-за моего недопонимания. Эти политики уже обрабатывают конфликты на уровне собственности. Вместо того, чтобы полностью отбрасывать одно из состояний объекта при конфликте, они сравнивают каждое свойство и применяют политику только к тем свойствам, которые оба изменились / существуют.

NSOverwriteMergePolicy и NSRollbackMergePolicy - это политики, которые приведут к одному из либо объект A, либо B полностью отбрасывается в случае конфликта.

...