2009-11-11 7 views
1

Dans mon application, j'ai un tas de données que je stocke dans le NSUserdefaults. Cette information se compose d'un NSObject (Object1) avec NSStrings et NSNumbers ainsi que 2 instances d'un autre objet (Object2). Après beaucoup de recherche et d'essai je l'ai eu pour enregistrer correctement (et charger) ces données à travers l'utilisation de NSCoding et NSKeydArchiver.iPhone NSUserDefaults difficulté de persistance

Chaque écran de mon application est essentiellement une vue d'une petite information provenant de ce modèle de données. Puisque l'on peut modifier les données dans certaines de ces vues, les données doivent être sauvegardées et chargées entre les transitions d'écran.

Ma chaîne vue de l'écran est: root -> Voir 1 -> sous-vue 1

Voici la partie étrange:

En vue secondaire 1 je charge le dataobject du NSUserdefaults et présenter les informations (ce fonctionne), l'utilisateur peut modifier les données (dans ce cas, un NSString décrivant un nom de société) Lorsque l'utilisateur appuie sur le bouton retour dans la barre supérieure pour revenir à "vue 1", il déclenche une sauvegarde (cela fonctionne aussi).

Retour à "Affichage 1" un événement viewWillAppear est déclenché. Dans ce déclencheur, je recharge les données sauvegardées de "subview 1" et redessine mon écran (un UITableViewController). Pour une raison quelconque, après le chargement, les changements effectués dans l'écran précédent ne sont pas reflétés! L'objet chargé contient toujours les mêmes valeurs que si l'enregistrement n'avait pas eu lieu! Après une certaine journalisation, il semble que même si j'APPELLE la sauvegarde avant la CHARGE, elle semble être exécutée plus tard. Les actions confirmées (par les points d'arrêt de débogage) sont donc -> LOAD -> SAVE -> LOAD. Mais selon la fonction de log (je consignerai chaque appel de sauvegarde et de chargement), il finit par -> LOAD -> LOAD -> SAVE.

Quelqu'un peut-il m'aider avec ceci? - Je n'ai aucune idée de ce que je fais de mal ici.

Ce code est appelé à partir d'un objet que je crée là où je en ai besoin (dans le temps, il doit être remplacé par un singleton) et i accéder aux données enregistrées et chargées par MyDataStoreObject.currentData

- (void) saveCurrentData { 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject: currentData]; 
    [defaults removeObjectForKey:@"MYAPP_CURRENTDATA"]; 
    [defaults setObject:data forKey:@"MYAPP_CURRENTDATA"]; 

    [defaults synchronize]; 
} 

- (void) loadCurrentData { 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    NSData *data = [defaults objectForKey:@"MYAPP_CURRENTDATA"]; 

    if (data == nil) 
    { 
     currentData = nil; 
     NSLog(@"NO DATA TO RETRIEVE FROM USERDEFAULTS"); 
    } 
    else 
    { 
     currentData = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
    } 
} 

Répondre

3

Appel synchronize sur votre NSUserdefaults après avoir enregistré, pour vous assurer que tout le contenu que vous enregistrez est écrit et conservé immédiatement.

Edit:

Dans

Lorsque l'utilisateur appuie sur le bouton de retour dans la barre supérieure pour revenir à « vue 1 » il déclenche une sauvegarde (cela fonctionne aussi).

Comment avez-vous fait cela? Montrez-nous le code qui attrape le bouton de retour étant touché, je suis curieux de savoir si elle effectue la sauvegarde à chaque fois.

+0

J'ai ajouté un extrait de code de la façon dont je charge et enregistre mes données. Le chargement et la sauvegarde fonctionnent, mais pour une raison quelconque, il n'est pas garanti de travailler dans l'ordre où j'appelle les fonctions? –

+0

Eh bien, il semble que mon chargement et mon code de sécurité fonctionnent correctement. Apparemment, il est possible pour une vue de déclencher un événement, après que la vue suivante ait déjà déclenché l'événement viewdidload. J'utilise maintenant la fonction viewWillDisapear à enregistrer et la fonction viewWillAppear à charger. phew! –

Questions connexes