[iOS] NSKEYARCHIVER

lundi 30 janvier 2017

La grande question que l’on peut se poser quand on créé une application mobile est de savoir comment nous allons conserver les données d’un lancement d’application à une autre.
C’est à dire comment garder exactement le même affichage d’une application lorsqu’on la relance par après.

Deux solutions: Core Data et NSKeyedArchiver / NSKeyedUnarchiver.

Une troisième solution viable est NSURLCache quand on a une application client serveur qui charge les données nécessaire à chaque lancement et associé au cache sur le disque.

Le choix de la solution se fait d’elle même dans le sens qu’on choisira Coredata si il y a besoin de relation entre les objets et un besoin de persistance plus complexe.
CoreData est aussi une solution beaucoup plus rapide que NSKeyedArchiver.

Le choix de NSKEYARCHIVER est intéressant si on a pas besoin de faire des queries dans les données tout le temps et que les objets ne sont pas trop volumineux.

Dans ce cas-ci nous parlerons de la solution NSKEYARCHIVER avec NSCoding qui est un protocole assez simple qui comporte deux méthodes:

-initWithCoder
-(void)encodeWithCoder:(NSCoder *)aCoder

permettant de serializer et deserializer avant d’archiver sur le disque.

Evidemment dans ce cas-ci,il faut encore enregistrer le résultat sur le disque.
Et déterminer ou ce résultat doit être sauvé est une autre question.

Deux solutions possibles écrire dans le filesystem ou alors utiliser NSUSERDEFAULTS.

  • File System:
    – Archivage
    NSKeyedArchiver.archiveRootObject(object, toFile: "/path/to/save")
    
    – Désarchivage
    guard let books = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/save") as? [object] else { return nil }
    
  • NSUSERDEFAULTS

    Chaque application possède une base de donnée contenant les préférences utilisateurs.

    – Archivage:
    let data = NSKeyedArchiver.archivedDataWithRootObject(object)
    NSUserDefaults.standardUserDefaults().setObject(data, forKey: "object")
    
    – Désarchivage:
    if let data = NSUserDefaults.standardUserDefaults().objectForKey("object") as? NSData {
        let object = NSKeyedUnarchiver.unarchiveObjectWithData(data)
    }
    

Si ce sont des données sensibles il vaut mieux utiliser le keychain dont vous trouverez un exemple complet d’utilisation ici

Concernant cet article je me suis inspiré de l’article de Matt thompson ici

Tags: IOS , NSCoding , NSKeyArchiver , NSUserdefault