web-dev-qa-db-fra.com

Comment synchroniser efficacement les enregistrements entre Core Data et CloudKit

J'apprends actuellement comment utiliser CloudKit Framework et le manque de documentation ou d'exemples montrant comment synchroniser Core Data et CloudKit.

J'ai regardé toutes les vidéos de la WWDC (2014, 2015, 2016) dédiées à CloudKit, mais aucune d'entre elles ne nous explique comment implémenter la synchronisation avec Core Data. Je ne trouve pas de nouveaux exemples, tutoriels ou livres, montrant comment implémenter cette synchronisation.

Je sais qu'il est efficace d'utiliser l'API Operations by CloudKit (pas l'API Convenience) et de s'abonner aux changements comme il est dit dans les nouvelles vidéos WWDC 2016, dédiées à CloudKit, mais la cartographie avec CoreData est un vrai problème.

Par exemple, supposons que je souhaite créer une application similaire à l'application Notes. en mode hors connexion, l'utilisateur peut créer ses notes et travailler avec eux en les enregistrant dans sa base de données de données de base. Lorsque l'appareil est en ligne, l'application vérifie ce qui a changé sur le serveur et enregistre les enregistrements nouvellement créés sur le serveur (CloudKit).

Lorsque l'application démarre, elle récupère également les modifications du CloudKit et s'il y a des modifications, elle met à jour le cache local (Core Data) avec les nouvelles modifications.

J'apprécierais d'avoir un schéma commun de synchronisation. Où placer la synchronisation avec les méthodes Core Data et à quoi elles devraient ressembler?

J'apprécierais toute information ou aide à ce sujet.

J'utilise Swift 3, Xcode 8, iOS 10.

25
Adelmaer

Core Data offre déjà à l'utilisateur la possibilité de se synchroniser avec iCloud. Il n'est pas nécessaire d'utiliser CloudKit.

Conception pour les données de base dans iCloud

Mais oui, Core Data avec iCloud est obsolète. Malgré cela, il a non interromp , et il n'y a pas de plans immédiats à Apple pour l'interrompre, ils veulent juste décourager son utilisation. Mais il a aussi des problèmes avec rationaliser les mises à jour de plusieurs appareils.

Dans tous les cas, je me suis demandé comment faire cela avec le kit cloud moi-même. Deux réponses; la première consiste à utiliser ce qui suit;

Couture dans GitHub

La seconde consiste à le faire manuellement;

Conception pour CloudKit

La clé ici est que Cloud Kit a besoin des métadonnées d'enregistrement pour pouvoir gérer les mises à jour d'enregistrement de manière fiable, vous devez donc enregistrer ces métadonnées dans votre base de données Core Data. La classe CKRecord comprend une méthode encodeSystemFields (with:) qui va coder ces champs dans un enregistrement de données qui peut être stocké dans votre base de données, puis vous pouvez utiliser le décodeur approprié lorsque vous devez restaurer le CKRecord.

Quoi qu'il en soit, je suis sur le point de commencer à le faire moi-même. Je le mettrai à jour avec plus d'informations lorsque je l'aurai.

11
Owen Godfrey

Apple a récemment publié un guide qui semble répondre à cette question. Consultez Apple Maintenance d'un cache local d'enregistrements CloudKit pour voir comment stocker les données CloudKit sur l'appareil.

Bien que ce guide ne fournisse pas d'exemple de code à écrire sur le périphérique, il répond au reste de la question. Cela vous indique comment récupérer les modifications de CloudKit et créer des données qui peuvent être stockées sur l'appareil.

5
Jake3231

Depuis iOS 13, de nouvelles API simplifient cette synchronisation pour les développeurs. Je vous recommande de regarder la session WWDC19 sur la nouvelle synchronisation entre CoreData et CloudKit. Veuillez noter que ces nouvelles API ne fonctionnent que pour iOS 13+.

Vidéo: https://developer.Apple.com/videos/play/wwdc2019/202/

En bref, vous devez commencer à utiliser NSPersistentCloudKitContainer au lieu de NSPersistentContainer. Cela permettra à la synchronisation de fonctionner automatiquement en utilisant la résolution automatique des conflits avec une stratégie de fusion dernier auteur-gagnant. Si vous souhaitez créer une bonne application fonctionnelle, vous devrez également effectuer certaines modifications pour améliorer la synchronisation de votre application.

La documentation officielle se trouve à:


Modélisation des données pour la collaboration (type de données répliqué sans conflit)

À la fin de la session, ils ont également montré un exemple de meilleure fusion de synchronisation que la "stratégie de fusion par défaut du dernier auteur-gagnant". L'utilisation de Causal Trees permet à plusieurs utilisateurs de modifier la même chaîne (et dans une certaine mesure d'étendre d'autres types de données) sans perdre aucune donnée. Je recommanderais vraiment à tout le monde de lire cet article d'Archagon qui décrit comment cela fonctionne et comment l'implémenter (également avec CloudKit synchronisation, mais pas la nouvelle automatique). Comme démontré dans la session, vous pouvez également l'implémenter avec la nouvelle synchronisation automatique entre CoreData et CloudKit.

5
Simon Backx