2012-01-10 22 views
23

Soy nuevo en el desarrollo de iOS y el desarrollo de aplicaciones móviles en general, tengo un conocimiento decente sobre los patrones de Objective C y MVC para usar y nunca he hecho ningún desarrollo de Mac.¿Por qué se usa NSUserDefaults en iOS?

Estoy tratando de entender para qué sirve NSUserDefaults?

Ya tenemos algo así como PList que almacena datos como XML y tenemos SQLite que es DB ligero para tales dispositivos.

Entonces, ¿por qué lo tenemos?

¿Es un almacenamiento de valor clave simple alternativo para nuestra aplicación de la misma manera que tenemos diferentes tipos de almacenamiento en la nube como un RDBMS y una tienda NoSQL basada en valores clave, etc.?

Para NSUserDefaults, dicen los documentos de Apple que: -

"Aplicaciones registro de estas preferencias por la asignación de valores a un conjunto de parámetros de la base de datos por defecto de un usuario"

¿Qué quieren decir con la base de datos por defecto del usuario ?

Supongo que, como en cualquier sistema operativo multiusuario, tenemos varias cuentas de usuario y de la misma manera en Mac también podríamos tener múltiples usuarios teniendo cada uno una base de datos desde donde las aplicaciones cargarían preferencias guardadas para ese usuario.

¿Así que, al igual que Mac OS X, iOS también tiene múltiples usuarios y dependiendo de lo que haya iniciado sesión NSUserDefaults elige sus preferencias?

Por favor, dime si estoy equivocado.

+0

Echa un vistazo a este: http://jayprakashdubey.blogspot.in/2014/07/nsuserdefault-usage.html –

Respuesta

13

Los NSUserDefaults se utilizan para guardar pequeñas porciones de datos de los que depende la aplicación para ejecutarse correctamente, mientras que otros enfoques son buenos para almacenar mayores cantidades de datos, con los que la aplicación trabaja.

NSUserDefaults hace que sea increíblemente fácil, ya que no tiene que preocuparse por archivos, entidades, recuperaciones, .... Todo se hace en una línea.

+1

Guardo algún valor en NSUserDefaults para utilizarlo en el relanzamiento de la aplicación. pero obtengo valor nulo en algún momento después de mucho tiempo de reiniciar la aplicación. – freelancer

+0

¿es esta una pregunta? escriba uno nuevo con todos los códigos relevantes, ya que NSUserDefaults debe almacenar información permanentemente. – vikingosegundo

1

NSUserDefaults valores almacenados solo para su aplicación.

Nota - No está destinado a servir como reemplazo de una tienda tradicional de datos (Core Data, SQLite, Property Lists, etc. están destinados a almacenar datos de aplicaciones). Para qué se usa NSUserDefaults es para pares de valores clave específicos.

Por ejemplo, la utilizo para almacenar la redid de un usuario autenticado y su nombre completo una vez que finaliza el proceso de inicio de sesión. Tras el tiempo de espera o cierre de sesión, borro esos valores. Por este NSUserDefaults brilla.

+0

¿El tipo de almacenamiento temporal NSUserDefaults es el mismo para una sesión de aplicaciones? lo mismo que el almacenamiento de sesiones en una aplicación web? –

+0

No. NSUserDefaults es para almacenamiento persistente. El total opuesto de temporal. Si desea que sus datos estén allí en todo momento y si son bastante pequeños, continúe y guárdelos en NSUserDefaults. Supongamos que está desarrollando un juego y su aplicación consiste en una Vista de configuración para que el usuario elija opciones como "Nombre de Nick", color, velocidad, etc. Luego, debe usar NSUserDefaults para guardar esas preferencias de usuario. También puede usar plist y sql-lite, pero la mejor práctica sugerida por la mayoría de los desarrolladores de iOS es usar NSUserDefaults para la configuración de la aplicación. –

4

Originalmente para almacenar configuraciones, pero parece que se usa (ab) para muchas otras cosas si las preguntas sobre SO son de alguna manera. El "punto" de esto es que proporciona un método de recuperación y persistencia de datos de una sola línea para una amplia gama de tipos de datos.

no hay ninguna configuración multiusuario (¿todavía?) en IOS (¿alguna vez ha tenido que iniciar sesión en su iPhone?) Que está integrado en NSUserDefaults, sino porque OS X y iOS están construidas sobre el mismo fundación, la misma clase se utiliza para ambos sistemas operativos.

+0

Así que el rol NSUserDefaults en MacOsX consistía en almacenar las configuraciones como valor-clave en la base de datos predeterminada del usuario desde donde las aplicaciones pueden recoger datos. Pero dígame, en iOS es simplemente un almacenamiento de valor de clave simple porque solo hay un usuario, por lo que el nombre NS "Usuario" ¿Prefijados como tales no tiene importancia aquí? Sin duda ... se está (ab) utilizando: P ¿Cuál es exactamente su caso de uso en iOS? Lo siento por ser un poco tonto pero no tengo un iphone. Desarrollé muchas aplicaciones web en mi postgrado y tengo que trabajar en iOS en mi empresa. –

+0

Esto debería haber sido seleccionado como la respuesta correcta. La pregunta original: "¿Así que, al igual que Mac OS X, iOS también tiene múltiples usuarios y, dependiendo de lo que haya iniciado sesión, NSUserDefaults elige sus preferencias?" no fue abordado desde la otra respuesta. – user523234

3

iOS es un sistema operativo para un solo usuario. Por lo tanto, NSUserDefaults se usa de manera diferente en OSX e iOS.

En iOS, normalmente utiliza NSUserDefaults para guardar preferencias de aplicaciones y/o datos de usuario en el "sistema predeterminado de iOS". Los datos guardados en el sistema predeterminado serán persistentes en todo momento incluso cuando reinicie el dispositivo iOS. De hecho, incluso cuando el usuario actualiza la aplicación.

Por lo general, desea utilizar NSUserDefaults para guardar las preferencias/configuraciones de la aplicación. Cualquier otro dato masivo como datos de juegos o cálculos en tiempo real debe guardarse en CoreData o sqllite en el directorio de documentos.

+0

En la actualización de la aplicación, los valores predeterminados del usuario se vacían. –

+0

@AnkitJain Otro hilo sugiere que eso no es cierto, aparte de problemas técnicos: http://stackoverflow.com/questions/1638766/do-nsuserdefaults-persist-through-an-update-to-an-app-in-the-appstore –

14

Una cosa que no se ha mencionado aún: NSUserDefaults admite todos los tipos escalares básicos (float, int, BOOL), así como los tipos compatibles con plist: NSData, NSSumber, NSNumber, NSDate, NSArray y NSDictionary. (Usted mencionó los plists como una alternativa: NSUserDefaults es solo un front-end de un archivo plist estándar en la carpeta de preferencias de la aplicación.) Esto hace que sea fácil crear un almacenamiento persistente para su estado de aplicación en unas pocas líneas de código. Aún mejor, si se implementa NSCoding en sus objetos del modelo, puede archivarlos en un NSData y ponerlos en NSUserDefaults:

NSData* data = [NSKeyedArchiver archivedDataWithRootObject:arrayOfModelObjects]; 

[[NSUserDefaults standardUserDefaults] setObject:data forKey:kDefaultsKeyModelObjects]; 

y restauración de datos de la aplicación es tan simple como

- (void)viewDidLoad 
{ 
    NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:kDefaultsKeyModelObjects]; 

    arrayOfModelObjects = [[NSKeyedUnarchiver unarchiveRootObject:data] retain]; 

    // error checking, tell UI to load the new values, etc... 
} 

(kDefaultsKeyModelObjects es una constante de cadena que ha definido en alguna parte. Siempre ponga sus claves NSUserDefaults en un solo lugar. Tener un error tipográfico en un nombre de clave puede demorar horas en depurarse :)

Si usó, por ejemplo, SQLite para almacenar sus datos de aplicación , tienes que escribir un montón de código para mov Los datos de su modelo entran y salen de la base de datos. Eso tiene sentido si está tratando con una gran cantidad de datos, necesita una búsqueda eficiente, etc .; pero si se trata, por ejemplo, de una lista de servidores en una aplicación de red, es más fácil y más limpio incluirlos en NSUserDefaults.

Una última cosa: NSUserDefaults es ideal para la creación de prototipos. Incluso si sabe que va a necesitar una tienda SQLite eventualmente, puede comenzar a usar NSUserDefaults como una tienda persistente rápida y fácil, y obtener su UI funcionando y su modelo de datos desarrollado antes de escribir un montón de código de base de datos.

Así como Mac OS X, qué IOS también tienen múltiples usuarios y dependiendo de lo que se registra en NSUserDefaults escoge su/sus preferencias?

No, en IOS los valores predeterminados plist está en la carpeta/Preferencias Biblioteca de la aplicación, no en una carpeta específica del usuario como es en OS X. No puedo imaginar iOS tendrá siempre múltiples inicios de sesión, pero se nunca se sabe. Si lo hiciera, tendrían que hacer listas de fallas por separado para diferentes usuarios.

Cuestiones relacionadas