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

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

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

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

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

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

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

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

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

Ответ 1

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

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

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

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

Шов в GitHub

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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


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

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