2009-12-10 1 views
3

Je travaille sur une application de devoirs qui utilise des objets d'affectation personnalisés pour chaque affectation. J'essaie de stocker un NSMutableArray (casted à un NSArray via initWithArray :) dans standardUserDefaults mais j'ai des problèmes avec l'enregistrement et le rechargement du tableau.UserDefaults/KeyedArchiver Frustrations

J'ai une vue tabulaire à partir de laquelle vous pouvez choisir d'ajouter une nouvelle affectation (qui charge NewAssignmentViewController). Lorsque vous enregistrez l'affectation, elle est repoussée vers un tableau dans AssigmentsViewController. Et puis vous l'appelez chaque fois que vous chargez le UITableView qui montre les affectations.

Voici le code relatif:

-(void)saveToUserDefaults:(NSArray*)myArray{ 
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 

if (standardUserDefaults) { 
    [standardUserDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"Assignments"]; 
    [standardUserDefaults synchronize]; 
    } 
} 

-(void)retrieveFromUserDefaults{ 
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"Assignments"]; 
if (dataRepresentingSavedArray != nil) { 
    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray]; 
    if ([oldSavedArray count] != 0) { 
     [assignments setArray:[[NSMutableArray alloc] initWithArray:oldSavedArray]]; 
    } 
    else { 
     assignments = [[NSMutableArray alloc] initWithCapacity:100]; 
    } 
} 
} 
-(void)backButtonPressed { 
[self saveToUserDefaults:[[NSArray alloc] initWithArray:assignments]]; 
[self.navigationController popViewControllerAnimated:YES]; 
} 

S'il vous plaît aider. Il ne charge pas le tableau mais ne donne aucune erreur. Des conseils sur UserDefault ou KeyedArchiver en général seraient grandement appréciés.

Répondre

0

Je ne sais pas si cela va résoudre votre problème, mais vous ne devez pas retirer le tableau de Defaults comme NSData. Vérifiez le NSUserDefaults reference et vous verrez que les tableaux sont des objets par défaut valides.

2

Couple de choses ici:

Si je vous comprends bien, vous essayez stocker un tableau dont le contenu sont les objets d'affectation.

Si vous souhaitez sérialiser ces objets pour le stockage dans NSUserDefaults, la cession objets eux-mêmes doivent se conformer au protocole de NSCoding en remplaçant ces méthodes:

- (void)encodeWithCoder:(NSCoder *)encoder; 
- (id)initWithCoder:(NSCoder *)decoder; 

Puisque vous ne publiez pas le code de vos objets d'affectation , ne sais pas si vous l'avez fait correctement ou pas du tout. Si vous avez, vous devriez être capable d'encoder l'objet. Voir le Archives and Serializations Programming Guide pour plus. En ce qui concerne NSUserDefaults, en lecture, vous essayez essentiellement d'y stocker le modèle objet de votre application. Pas la meilleure idée. NSUserDefaults convient le mieux pour une utilisation avec des données persistantes légères: préférences de base, chaînes, fragments de données universelles.

Ce que je ferais est d'écrire vos données archivées dans un fichier et de le charger lorsque votre vue se charge.

est Voici une partie de Beginning iPhone Development sur ce sujet:

Création d'une archive à partir d'un objet ou d'objets qui est conforme à NSCoding est relativement facile. Tout d'abord, nous créons une instance de NSMutableData pour contenir les données codées puis créer une instance NSKeyedArchiver pour archiver des objets dans ce cas NSMutableData:

NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 

Après avoir créé ces deux questions, nous utilisons alors la valeur clé codage pour archiver tous les objets que nous voulons inclure dans l'archive, comme celui-ci:

[archiver encodeObject:myObject forKey:@”keyValueString”]; 

Une fois que nous avons tous les objets encodé nous vouloir inclure, nous disons simplement à l'archiveur que nous avons terminé, écrire l'instance NSMutableData dans le système de fichiers, et faire le nettoyage de la mémoire sur nos objets.

[archiver finishEncoding]; BOOL success = [data writeToFile:@”/path/to/archive” atomically:YES]; 
[archiver release]; 
[data release]; 

Pour reconstituer des objets de l'archive, nous passons par un processus similaire. Nous créons une instance NSData à partir du fichier archive et créons un NSKeyedUnarchiver pour décoder les données: NSData * data = [[NSData alloc] initWithContentsOfFile: chemin]; NSKeyedUnarchiver * unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: données]; Après cela, nous lisons nos objets de la Unarchiver en utilisant la même clé que nous avons utilisé pour archiver l'objet:

self.object = [unarchiver decodeObjectForKey:@”keyValueString”]; 

Vous auriez aussi besoin d'obtenir votre application's documents directory pour enregistrer et charger les fichiers.

C'est un livre extrêmement utile, rempli de fragments de code. Le chapitre sur la persistance pourrait vous être utile. Vous pourriez être beaucoup plus heureux d'utiliser Core Data pour cette tâche, pensez-y.