Descubrí una alternativa, antes de guardar, codifico el objeto raíz ( NSArray
objeto) usando NSKeyedArchiver
, que termina con NSData
. Luego use UserDefaults y guarde el NSData
.
Cuando necesito los datos, leo NSData
y utilizo NSKeyedUnarchiver
para NSData
volver a convertir el objeto.
Es un poco engorroso, porque necesito convertir a / de NSData
cada vez, pero simplemente funciona.
Aquí hay un ejemplo por solicitud:
Salvar:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *arr = ... ; // set value
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
[defaults setObject:data forKey:@"theKey"];
[defaults synchronize];
Carga:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"theKey"];
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
El elemento en la matriz implementa
@interface CommentItem : NSObject<NSCoding> {
NSString *value;
}
Luego, en la implementación de CommentItem
, proporciona dos métodos:
-(void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:value forKey:@"Value"];
}
-(id)initWithCoder:(NSCoder *)decoder
{
self.value = [decoder decodeObjectForKey:@"Value"];
return self;
}
¿Alguien tiene una mejor solución?
Gracias a todos.
Si está guardando un objeto en los valores predeterminados del usuario, todos los objetos, recursivamente, hasta el final, deben ser objetos de la lista de propiedades. Cumplir con NSCoding no significa nada aquí:
NSUserDefaults
no los codificará automáticamenteNSData
, debe hacerlo usted mismo. Si su "lista de objetos que implementaNSCoding
" significa objetos que no son objetos de la lista de propiedades, entonces tendrá que hacer algo con ellos antes de guardarlos en los valores predeterminados del usuario.FYI las clases de lista propiedad son
NSDictionary
,NSArray
,NSString
,NSDate
,NSData
, yNSNumber
. Puede escribir subclases mutables (comoNSMutableDictionary
) a las preferencias del usuario, pero los objetos que lee siempre serán inmutables.fuente
¿Están todas sus claves en el diccionario
NSString
? Creo que tienen que estarlo para guardar el diccionario en una lista de propiedades.fuente
La respuesta más simple:
NSDictionary
es solo un objeto plist , si las claves son NSStrings . Por lo tanto, guarde la "clave" comoNSString
constringWithFormat
.Solución:
Beneficios:
NULL
.fuente
¿Has pensado en implementar el
NSCoding
Protocolo? Esto le permitirá codificar y decodificar en el iPhone con dos métodos simples que se implementan con elNSCoding
. Primero necesitaría agregar elNSCoding
a su clase.Aquí hay un ejemplo:
Esto está en el archivo .h
Entonces deberá implementar dos métodos del Protocolo NSCoding.
Consulte la documentación en NSCoder para obtener más información. Eso ha sido muy útil para mis proyectos en los que necesito guardar el estado de la aplicación en el iPhone si la aplicación está cerrada y restaurarla a su estado cuando está nuevamente activada.
La clave es agregar el protocolo a la interfaz y luego implementar los dos métodos que forman parte
NSCoding
.¡Espero que esto ayude!
fuente
No hay mejor solución. Otra opción sería simplemente guardar el objeto codificado en el disco, pero eso es lo mismo. Ambos terminan con NSData que se decodifica cuando quieres recuperarlo.
fuente