Синхронизация старых данных с NSPersistentCloudKitContainer
Я использую NSPersistentCloudKitContainer
синхронизировать данные между различными устройствами с CloudKit. Он отлично работает с новым проектом, однако, когда я использую его со старыми проектами, старые данные, которые были добавлены с NSPersistentContainer
не синхронизируется.
Чего я хотел бы добиться, так это синхронизировать старые данные, которые были добавлены с NSPersistentContainer
после изменения на NSPersistentCloudKitContainer
, Является ли это возможным?
1 ответ
Я нашел решение, которое работает для моей базы данных Core Data - и мое довольно сложное с множеством взаимосвязей "многие ко многим" (приложение для журнала операций / анестезии под названием Somnus)
Я начал с создания нового атрибута для всех моих основных объектов данных под названием sentToCloud
и установив его FALSE
по умолчанию в базовой модели данных.
При первой загрузке для существующего пользователя:
- Получить запрос с использованием предиката
"sentToCloud == FALSE"
для каждого типа сущности - + Изменить
sentToCloud
вTRUE
для каждого объекта затем сохраните MOC - Это вызывает
NSPersistentCloudKitContainer
начать синхронизацию
Я сделал это в порядке "приоритета", который работает для моей базы данных, при условии, что сеансы синхронизации iCloud соответствуют порядку, в котором модифицируются базовые данные. В моем тестировании это выглядит так:
- Сначала я синхронизирую все дочерние (или большинство дочерних) объектов
- Затем синхронизируйте их родителей, и так далее, вверх по дереву
- Я синхронизирую Объект, с которым пользователь взаимодействует последним, как только все остальное будет на месте, поэтому отношения не затронуты, и они не думают, что их данные скрыты, пока мы ждем
NSPersistentCloudKitContainer
восстановить все отношения - Я также оставляю любые двоичные данные (волшебным образом превращается в
CKAsset
за кулисами), чтобы продлиться, поскольку это не самая важная часть моей базы данных
Моя база данных успешно синхронизирована с моего iPad на iPhone, и все отношения и двоичные данные отображаются правильно.
Теперь все, что мне нужно, - это способ сообщить пользователю, когда происходит синхронизация данных (и / или какой-то прогресс), и полностью отключить его.
ДОПОЛНЕНИЕ
Поэтому я попробовал это снова, после сброса всех данных на панели инструментов iCloud и удаления приложений на моем iPhone и iPad.
Второй раз вокруг него синхронизируются только некоторые данные. Кажется, что по-прежнему есть проблема, связанная с большими запросами синхронизации (много .limitExceeded
CKErrors в консоли).
Что расстраивает, так это то, что не ясно, разбивает ли он запросы на повторную попытку или нет - я так не думаю. Я оставил это на ночь и до сих пор нет дальнейшей синхронизации, только больше .limitExceeded
CKErrors.
Может быть, поэтому они не хотят синхронизировать существующие данные?
Лично я считаю это глупым. Иногда пользователи выполняют пакетный процесс над своими данными, который включает обновление многих тысяч объектов базовых данных за одно действие. Если это только собирается застрять .limitExceeded
CKErrors, NSPersistentCloudKitContainer
не будет очень хорошим решением для синхронизации.
Им нужен лучший способ справиться с этими ошибками (разбивка запросов на более мелкие запросы), а также возможность увидеть, что происходит (и, возможно, представить некоторый пользовательский интерфейс пользователю).
Мне действительно нужно, чтобы это работало, потому что в существующем состоянии нет способа синхронизировать взаимосвязи базовых данных "многие ко многим" с помощью CloudKit.
Я просто надеюсь, что они все еще работают над этим классом и улучшают его.