J'ai trouvé une alternative, avant de sauvegarder, j'encode l'objet racine ( NSArray
objet) en utilisant NSKeyedArchiver
, qui se termine par NSData
. Utilisez ensuite UserDefaults pour enregistrer le fichier NSData
.
Lorsque j'ai besoin des données, je lis le NSData
, et je l' utilise NSKeyedUnarchiver
pour le reconvertir NSData
en objet.
C'est un peu encombrant, car j'ai besoin de convertir vers / depuis NSData
chaque fois, mais cela fonctionne.
Voici un exemple par demande:
Sauver:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *arr = ... ; // set value
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
[defaults setObject:data forKey:@"theKey"];
[defaults synchronize];
Charge:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"theKey"];
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
L'élément du tableau implémente
@interface CommentItem : NSObject<NSCoding> {
NSString *value;
}
Ensuite, dans la mise en œuvre de CommentItem
, fournit deux méthodes:
-(void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:value forKey:@"Value"];
}
-(id)initWithCoder:(NSCoder *)decoder
{
self.value = [decoder decodeObjectForKey:@"Value"];
return self;
}
Quelqu'un a une meilleure solution?
Merci tout le monde.
Si vous enregistrez un objet dans les valeurs par défaut de l'utilisateur, tous les objets, récursivement, jusqu'en bas, doivent être des objets de liste de propriétés. Se conformer à NSCoding ne veut rien dire ici -
NSUserDefaults
ne les encodera pas automatiquementNSData
, vous devez le faire vous-même. Si votre "liste d'objets qui implémenteNSCoding
" signifie des objets qui ne sont pas des objets de liste de propriétés, alors vous devrez faire quelque chose avec eux avant d'enregistrer les valeurs par défaut de l'utilisateur.Pour votre information , les classes de la liste des biens sont
NSDictionary
,NSArray
,NSString
,NSDate
,NSData
etNSNumber
. Vous pouvez écrire des sous-classes modifiables (commeNSMutableDictionary
) dans les préférences de l'utilisateur, mais les objets que vous lisez seront toujours immuables.la source
Toutes vos clés sont-elles dans le dictionnaire
NSString
? Je pense qu'ils doivent l'être pour enregistrer le dictionnaire dans une liste de propriétés.la source
Réponse la plus simple:
NSDictionary
est uniquement un objet plist , si les clés sont des NSStrings . Alors, stockez la "clé" commeNSString
avecstringWithFormat
.Solution :
Avantages :
NULL
.la source
Avez-vous envisagé de mettre en œuvre le
NSCoding
Protocole? Cela vous permettra d'encoder et de décoder sur l'iPhone avec deux méthodes simples implémentées avec leNSCoding
. Vous devez d'abord ajouter leNSCoding
à votre classe.Voici un exemple:
C'est dans le fichier .h
Ensuite, vous devrez implémenter deux méthodes du protocole NSCoding.
Consultez la documentation sur NSCoder pour plus d'informations. Cela s'est avéré très pratique pour mes projets où je dois enregistrer l'état de l'application sur l'iPhone si l'application est fermée et la restaurer à son état lorsqu'elle est de retour.
La clé est d'ajouter le protocole à l'interface, puis d'implémenter les deux méthodes qui font partie de
NSCoding
.J'espère que ça aide!
la source
Il n'y a pas de meilleure solution. Une autre option serait de simplement enregistrer l'objet codé sur le disque - mais cela fait la même chose. Ils se retrouvent tous les deux avec NSData qui est décodé lorsque vous le souhaitez.
la source