Données de base et Swift: mises à jour par lots

Même si Core Data existe depuis de nombreuses années sur OS X et iOS, une fonctionnalité qui n’a été ajoutée que récemment est des mises à jour par lots. Les développeurs demandent cette fonctionnalité depuis de nombreuses années et Apple a enfin trouvé un moyen de l’intégrer dans Core Data. Dans ce didacticiel, je vais vous montrer comment fonctionnent les mises à jour par lots et ce qu’elles signifient pour le framework Core Data.

1. Le problème

Core Data est excellent pour gérer les graphiques d’objets. Même les graphiques d’objets complexes avec de nombreuses entités et relations ne sont pas vraiment un problème pour les données de base. Cependant, Core Data présente quelques points faibles, la mise à jour d’un grand nombre d’enregistrements étant l’un d’entre eux.

Le problème est facile à comprendre. Chaque fois que vous mettez à jour un enregistrement, Core Data charge l’enregistrement en mémoire, met à jour l’enregistrement et enregistre les modifications dans le magasin persistant, une base de données SQLite par exemple.

Si Core Data doit mettre à jour un grand nombre d’enregistrements, il doit charger chaque enregistrement en mémoire, mettre à jour l’enregistrement et envoyer les modifications au magasin persistant. Si le nombre d’enregistrements est trop important, iOS renflouera simplement en raison d’un manque de ressources. Même si un périphérique exécutant OS X peut avoir les ressources nécessaires pour exécuter la demande, il sera lent et consommera beaucoup de mémoire.

Une autre approche consiste à mettre à jour les enregistrements par lots, mais cela prend également beaucoup de temps et de ressources. Sur iOS 7, c’est la seule option dont disposent les développeurs iOS. Ce n’est plus le cas depuis iOS 8 et OS X Yosemite.

2. La solution

Sur iOS 8 et plus et OS X Yosemite et plus, il est possible de parler directement au magasin persistant et de lui dire ce que vous souhaitez changer. Cela implique généralement la mise à jour d’un attribut. Apple appelle cette fonctionnalité des mises à jour par lots.

Il y a cependant un certain nombre de pièges à surveiller. Core Data fait beaucoup de choses pour vous et vous ne le réaliserez peut-être même pas tant que vous n’aurez pas utilisé les mises à jour par lots. La validation est un bon exemple. Étant donné que Core Data effectue des mises à jour par lots directement sur le magasin persistant, comme une base de données SQLite, Core Data ne peut pas effectuer de validation sur les données que vous écrivez dans le magasin persistant. Cela signifie que vous êtes chargé de vous assurer de ne pas ajouter de données invalides au magasin persistant.

Quand utiliseriez-vous des mises à jour par lots? Apple recommande de n’utiliser cette fonctionnalité que si l’approche traditionnelle est trop gourmande en ressources ou en temps. Si vous devez marquer des centaines ou des milliers d’e-mails comme lus, les mises à jour par lots sont la meilleure solution sur iOS 8 et plus et OS X Yosemite et plus.

3. Comment ça marche?

Pour illustrer le fonctionnement des mises à jour par lots, je suggère de revoir Done, une simple application Core Data qui gère une liste de tâches. Nous ajouterons un bouton à la barre de navigation qui marque chaque élément de la liste comme terminé.

En relation :  Comment télécharger vos données de confidentialité depuis Spotify

Étape 1: Configuration du projet

Téléchargez ou clonez le projet à partir de GitHub et ouvrez-le dans Xcode 7. Exécutez l’application dans le simulateur et ajoutez quelques tâches.

Ajouter des tâches

Étape 2: Créer un élément de bouton de barre

Ouvert ViewController.swift et déclarer une propriété, checkAllButton, de type UIBarButtonItem au sommet.

Initialisez l’élément de bouton de barre dans le viewDidLoad() méthode de la ViewController class et définissez-le comme élément du bouton de la barre de gauche de l’élément de navigation.

Étape 3: mise en œuvre checkAll(_:) Méthode

le checkAll(_:) La méthode est assez simple, mais il y a quelques mises en garde à surveiller. Jetez un œil à sa mise en œuvre ci-dessous.

Créer une demande de lot

Nous commençons par créer un NSEntityDescription exemple pour le Article entité et l’utiliser pour initialiser un NSBatchUpdateRequest objet. le NSBatchUpdateRequest class est une sous-classe de NSPersistentStoreRequest.

Nous définissons le type de résultat de la demande de mise à jour par lots sur .UpdatedObjectIDsResultType, une valeur de membre du NSBatchUpdateRequestResultType enum. Cela signifie que le résultat de la demande de mise à jour par lots sera un tableau contenant les ID d’objet, les instances du NSManagedObjectID classe, des enregistrements qui ont été modifiés par la demande de mise à jour par lots.

Nous peuplons également le propertiesToUpdate propriété de la demande de mise à jour par lots. Pour cet exemple, nous définissons propertiesToUpdate à un dictionnaire contenant une clé, "done", avec valeur NSNumber(bool: true). Cela signifie que chaque Article record sera réglé sur terminé, c’est ce que nous recherchons.

Exécuter la demande de mise à jour par lots

Même si les mises à jour par lots contournent le contexte de l’objet géré, l’exécution d’une demande de mise à jour par lots se fait en appelant executeRequest(_:) sur un NSManagedObjectContext exemple. Cette méthode accepte un argument, une instance du NSPersistentStoreRequest classe. Car executeRequest(_:) est une méthode de lancement, nous exécutons la méthode dans un do-catch déclaration.

Mise à jour du contexte d’objet géré

Même si nous transmettons la demande de mise à jour par lots à un contexte d’objet géré, le contexte d’objet géré n’est pas conscient des modifications résultant de l’exécution de la demande de mise à jour par lots. Comme je l’ai mentionné précédemment, il contourne le contexte d’objet géré. Cela donne aux mises à jour par lots leur puissance et leur vitesse. Pour remédier à ce problème, nous devons faire deux choses:

En relation :  Utilisateurs iOS et Mac: vous devez mettre à jour dès maintenant
  • transformer les objets gérés qui ont été mis à jour par la mise à jour par lots en défauts
  • dire au contrôleur des résultats récupérés d’effectuer une extraction pour mettre à jour l’interface utilisateur

C’est ce que nous faisons dans les prochaines lignes du checkAll(_:) méthode dans le do clause de la do-catch déclaration. Si la demande de mise à jour par lots aboutit, nous extrayons le tableau de NSManagedObjectID instances du NSBatchUpdateResult objet.

Nous parcourons ensuite le objectIDs tableau, demandez au contexte de l’objet géré le NSManagedObject instance, et transformez-la en erreur en invoquant refreshObject(_:mergeChanges:), en passant l’objet géré comme premier argument. Pour forcer l’objet géré en faute, on passe false comme deuxième argument.

Récupération des enregistrements mis à jour

La dernière étape consiste à dire au contrôleur des résultats récupérés d’effectuer une extraction pour mettre à jour l’interface utilisateur. Si cela échoue, nous détectons l’erreur dans le catch clause de la do-catch déclaration.

Bien que cela puisse sembler encombrant et assez complexe pour une opération facile, gardez à l’esprit que nous contournons la pile de données de base. En d’autres termes, nous devons nous occuper de certaines tâches ménagères qui sont généralement effectuées pour nous par Core Data.

Étape 4: Construire et exécuter

Générez le projet et exécutez l’application dans le simulateur ou sur un appareil physique. Cliquez ou appuyez sur l’élément du bouton de la barre à droite pour vérifier chaque élément à faire de la liste.

Vérifier toutes les tâches

Conclusion

Les mises à jour par lots sont un excellent ajout à la structure Core Data. Non seulement cela répond à un besoin des développeurs depuis de nombreuses années, mais il n’est pas difficile à mettre en œuvre tant que vous gardez à l’esprit quelques règles de base. Dans le prochain didacticiel, nous examinerons de plus près les suppressions par lots, une autre fonctionnalité du framework Core Data qui n’a été ajoutée que récemment.

Moyens Staff
Moyens I/O Staff vous a motivé, donner des conseils sur la technologie, le développement personnel, le style de vie et des stratégies qui vous aider.