Ансамбли и миграция основных данных

В настоящее время я провожу некоторые тесты с Ensembles, в частности тестируя легкую миграцию Core Data.

Моя текущая конфигурация выглядит следующим образом:

  • Устройство-A запускает мое приложение с моделью данных 1
  • Устройство-B запускает мое приложение с моделью данных 2
  • модель данных 2 основана на модели данных 1 с одним дополнительным строковым свойством, которое является необязательным.

Мой сценарий выглядит следующим образом:

  • Вначале при запуске моего приложения с моделью данных 1 как на устройстве A, так и на устройстве B все отлично синхронизировалось с использованием Ensembles (конфигурация iCloud).
  • На устройстве-B установите и запустите мое обновленное приложение, используя модель данных 2.
  • На устройстве-A продолжайте запускать мое старое приложение, используя модель данных 1, и добавляйте новую запись.
  • Результат: новая запись, добавленная на Устройство-А, загружается в iCloud, а затем синхронизируется с устройством-Б.

Мой вопрос: могу ли я настроить Ensembles, чтобы предотвратить загрузку изменений в iCloud, если эта связанная модель данных не является последней? (т.е. в моем случае Device-A загружает объект на основе модели данных 1, в то время как iCloud уже основан на модели данных 2)

Заранее спасибо!

ОБНОВЛЕНИЕ 1:

Дрю, большое спасибо за ответ. Я определенно согласен с тем, что загрузку нельзя (и, вероятно, не следует) предотвращать, поскольку Ensembles — это децентрализованная одноранговая система.

В идеальном случае хотелось бы, чтобы устройство с новой моделью данных игнорировало данные, основанные на старой модели данных. (аналогично существующему поведению, когда устройство со старой моделью данных будет игнорировать любые данные, основанные на новой модели данных). Это поддерживается?

Если нет, рассмотрите в качестве примера следующий сценарий:

  • В старой модели данных есть объект под названием «Книга» с двумя свойствами: название и автор (оба поля необязательны).
  • В новой модели данных есть новое необязательное свойство titleFirstLetter, которое должно содержать первую букву поля заголовка.

В настоящее время, когда Ensembles не задействован, у меня есть полный контроль при сохранении нового NSManagedObject в хранилище постоянства. Поэтому обновленный код моего приложения, отвечающего за добавление новой книги, обязательно извлечет первую букву из поля заголовка и сохранит ее в новом свойстве titleFirstLetter. (т. е. книга под названием Catch-22 будет иметь C в свойстве titleFirstLetter при сохранении книги).

Кроме того, когда в основном стеке данных происходит легкая миграция, я обнаруживаю это и выполняю одноразовую процедуру, в которой перебираю все существующие книги в базе данных и устанавливаю titleFirstLetter в соответствии со значением title. С этого момента и далее база данных является согласованной и действительной, а новый код гарантирует, что будущие книги, добавленные в базу данных, сохранят ее действительность.

Что касается Ensembles, если у меня нет никакого контроля над старыми данными, поступающими от устройств с более старой моделью данных, как я могу заполнить новое свойство titleFirstLetter, если мой код никогда не вызывается?

Спасибо Вам за Вашу помощь!


person Joshua    schedule 02.03.2016    source источник


Ответы (1)


Вы не можете предотвратить это, нет. Ensembles — это децентрализованная одноранговая система. На самом деле одно устройство не может узнать текущее состояние другого устройства, поэтому вы не можете предотвратить загрузку.

Обновленное устройство должно быть способно обрабатывать старые данные с другого устройства. Устройство со старой моделью будет игнорировать любые данные, основанные на новой модели, пока оно тоже не будет обновлено. Затем он объединит все эти игнорируемые данные.

Лучше избегать миграции, где это возможно, и придерживаться простых вещей, таких как добавление свойств или сущностей, а не хитрых рефакторингов. Если вам нужно внести много изменений, подумайте о том, чтобы просто начать с нового ансамбля (например, изменить идентификатор ансамбля).

person Drew McCormack    schedule 02.03.2016
comment
Дрю, большое спасибо за ответ! См. ОБНОВЛЕНИЕ 1 по моему первоначальному вопросу. - person Joshua; 02.03.2016
comment
Ваш код вызывается. Для этого существует множество методов делегирования. Вы можете просмотреть изменения в методе делегата после слияния или в блоке завершения слияния и применить свои специальные изменения. - person Drew McCormack; 04.03.2016
comment
Ты прав. Я только что понял, что persistStoreEnsemble:didSaveMergeChangesWithNotification: будет нацелен именно на то, что мне нужно. Спасибо, что указали мне правильное направление! - person Joshua; 06.03.2016