Как эффективно синхронизировать записи между Core Data и CloudKit

В настоящее время я изучаю, как использовать CloudKit Framework и не хватает документации или примеров, показывающих, как синхронизировать Core Data и CloudKit.

Я просмотрел все видеоролики WWDC (2014, 2015, 2016), посвященные CloudKit, но ни один из них не рассказал нам, как реализовать синхронизацию с Core Data. Я не могу найти свежие примеры, учебные пособия или книги, показывающие, как реализовать эту синхронизацию.

Я знаю, что эффективно использовать Operations API от CloudKit (не Convenience API) и подписываться на изменения, как сказано в новых видеороликах WWDC 2016, посвященных CloudKit, но сопоставление с CoreData является реальной проблемой.

Например, допустим, я хотел бы создать приложение, подобное приложению Notes. в автономном режиме пользователь может создавать свои заметки и работать с ними, сохраняя их в своей основной базе данных. Когда устройство подключается к сети, приложение проверяет, что изменилось на сервере, и сохраняет вновь созданные записи на сервере (CloudKit).

Когда приложение запускается, оно также выбирает изменения из CloudKit и, если есть изменения, обновляет локальный кеш (Базовые данные) с учетом новых изменений.

Я был бы признателен за общую схему синхронизации. Где разместить синхронизацию с методами Core Data и как они должны выглядеть?

Буду признателен за любую информацию или помощь по этому поводу.

Я использую Swift 3, Xcode 8, iOS 10.

2 ответа

Начиная с iOS 13, есть новые API, которые упрощают эту синхронизацию для разработчиков. Я бы порекомендовал вам посмотреть сессию WWDC19 о новой синхронизации между CoreData и CloudKit. Обратите внимание, что этот новый API работает только с iOS 13+.

Видео: https://developer.apple.com/videos/play/wwdc2019/202/

Короче, вам нужно начать использовать NSPersistentCloudKitContainer вместо того NSPersistentContainer. Это позволит синхронизировать работу автоматически, используя автоматическое разрешение конфликтов со стратегией слияния "победил последний автор". Если вы хотите создать хорошее работающее приложение, вам также необходимо внести некоторые изменения, чтобы улучшить синхронизацию вашего приложения.

Официальную документацию можно найти по адресу:


Моделирование данных для совместной работы (бесконфликтный реплицированный тип данных)

В конце сеанса они также продемонстрировали пример лучшей синхронизации слияния, чем стандартная стратегия слияния "победил последний автор". Использование причинных деревьев позволяет нескольким пользователям редактировать одну и ту же строку (и, в некоторой степени, другие типы данных) без потери данных. Я действительно рекомендую всем прочитать эту статью от Archagon, в которой описывается, как это работает и как это реализовать (также с синхронизацией CloudKit, но не с новой автоматической). Как показано в сеансе, вы также можете реализовать это с помощью новой автоматической синхронизации между CoreData и CloudKit.

Базовые данные уже предоставляют пользователю возможность синхронизации с iCloud. Нет необходимости использовать CloudKit.

Дизайн для основных данных в iCloud

Но да, Core Data с iCloud устарела. Тем не менее, он не был прекращен, и у Apple нет никаких планов прекратить его, они просто хотят препятствовать его использованию. Но у него также есть проблемы с рационализацией обновлений с нескольких устройств.

В любом случае, я сам изучал вопрос, как это сделать с помощью облачного комплекта. Два ответа; во-первых, использовать следующее;

Шов в GitHub

Второе - сделать это вручную;

Проектирование для CloudKit

Ключевым моментом здесь является то, что Cloud Kit нужны метаданные записей, чтобы иметь возможность надежно обрабатывать обновления записей, поэтому вы должны сохранить эти метаданные в базе данных Core Data. Класс CKRecord включает метод encodeSystemFields(with:), который будет кодировать эти поля в запись данных, которая может храниться в вашей базе данных, а затем вы сможете использовать соответствующий декодер, когда вам нужно восстановить CKRecord.

Во всяком случае, я собираюсь начать делать это сам. Я обновлю это с большей информацией, когда у меня будет это.

Apple недавно опубликовала руководство, которое, похоже, ответит на этот вопрос. Чтобы узнать, как хранить данные CloudKit на устройстве, обратитесь к разделу " Поддержка локального кэша записей CloudKit" компании Apple.

Хотя это руководство не предоставляет пример кода для записи на устройство, оно отвечает на остальную часть вопроса. Это говорит вам, как получить изменения из CloudKit и создать данные, которые могут быть сохранены на устройстве.

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