2009-06-25 6 views
6

Estoy confundido acerca de NSUserDefaults en el iPhone.¿Hay alguna forma mejor de poner un montón de cosas en NSUserDefaults?

Vengo de un fondo de C/asm y el material de Objective-C ha sido una experiencia de aprendizaje.

Actualmente estoy usando NSUserDefaults para almacenar algunas cadenas (para los nombres en una tabla de mejores puntuaciones). Quiero comenzar a implementar una función de tipo "Guardar juego", así que si el usuario recibe una llamada o sale del juego por un momento, puede volver a ella.

Para recuperar el juego, tengo un par de BOOL banderas, un par de int s para almacenar algunas variables necesarias, pero estoy atascado en una matriz que necesito almacenar.

Tengo una matriz de 50 elementos de unsigned char s. Podría moverlo a int s si fuera más fácil, pero simplemente no lo veo.

Para trabajar con NSUserDefaults puedo setBool (ya lo está haciendo eso), setFloat (de nuevo, ya que hacer), setInteger y setObject.

Obviamente, podría declarar claves para cada elemento de la matriz y almacenarlas una por una con setInteger, pero eso es realmente kludgy. ¿Cuál es la mejor manera de abordar esto? En lugar de una matriz de unsigned char s, de alguna manera trato de usar un NSObject? ¿Hay algún buen tutorial en NSObject que pueda leer para entenderlo mejor?

Respuesta

5

¿Las listas de propiedades encajarían mejor con lo que estás tratando de lograr?

Puede crear el diccionario, almacenar el valor de cada configuración o una matriz, y luego volcarlo a la Lista de propiedades. Puede leerlos fácilmente o actualizar los valores en función de las claves.

http://developer.apple.com/documentation/Cocoa/Conceptual/PropertyLists/...

+1

Sí, normalmente usaría NSUserDefaults para las preferencias (como elegir unidades imperiales y métricas), y almacenar los datos de su aplicación en un archivo separado utilizando listas de propiedades serializadas, sqlite, Core Data, etc. –

+0

De acuerdo, los valores predeterminados del usuario son para prefs, pero los datos deben almacenarse en otro lugar, como por ejemplo en "~/Library/Application Support/MyApp /" por ejemplo. –

+0

En iPhone, obviamente hay diferentes convenciones para almacenar datos, ya que la estructura es muy diferente. Consulte las guías de programación de iPhone correspondientes para obtener detalles sobre el almacenamiento de archivos para su aplicación. –

2

Puede pasar un NSArray o un NSDictionary-NSUserDefaults con setObject:forKey:. Funciona bien. Obviamente, su matriz de caracteres sin firmar tendría que convertirse en un NSArray de NSNumbers, lo que implica una sobrecarga, pero probablemente sea la opción más fácil.

1

Trate de usar un objeto NSData, que puede ser almacenado directamente a NSUserDefaults

[[NSUserDefaults standardUserDefaults] setObject:[NSData dataWithBytes:array length:len] 
              forKey:@"someArray"]; 
0

Whoa allí, que realmente debería mirar en el uso de datos básicos (o simplemente SQLLite) para almacenar el estado del juego. NSUserDefaults es por lo que dice - por defecto, configuración de configuración. En realidad, no está destinado a almacenar grandes trozos de datos binarios.

0

Para convertir un 50 elemento de C serie de caracteres sin signo en un NSArray que se puede almacenar en un NSUserDefaults usando:

NSMutableArray* a = [NSMutableArray new]; 
for (int i = 0; i < 50; ++i) { 
    [a addObject:[NSNumber numberWithInteger:yourArray[i]]]; 
} 
[[NSUserDefaults standardUserDefaults] setObject:a forKey:@"theArray"]; 
[a release]; 

para recuperarlo:

NSArray* a = [[NSUserDefaults standardUserDefaults] objectForKey:@"theArray"]; 
for (int i = 0; i < 50; ++i) { 
    yourArray[i] = [[a objectAtIndex:i] integerValue]; 
} 

Ciertamente, no hay problema con el uso de NSUserDefaults para almacenar su estado de juego, no cuando es tan pequeño. Si el estado de su juego fue poco atractivo, es posible que desee investigar y almacenarlo como un archivo plist, pero NSUserDefaults no dejará de sudar el manejo de esta cantidad trivial de datos.

+0

Gracias por el código y la recomendación. Lo intentaré. – K2Digital

Cuestiones relacionadas