2012-02-06 9 views
5

Cuando Soy la creación de las preferencias por defecto de mi aplicación, estoy haciendo lo siguiente:¿Por qué usar registerDefaults: en lugar de setValue: forKey :?

1) Lectura Root.plist desde el interior Settings.bundle en un diccionario.

2) I prueba si se ha establecido una preferencia, y si no estoy registrar mi diccionario por defecto a través de [NSUserDefaults standardUserDefaults] registerDefaults:]

El problema es, por defecto registrados con registerDefaults: no voy al almacén persistente, por lo que si el usuario nunca cambia sus preferencias. Estoy leyendo mis preferencias predeterminadas y registrándolas con NSUserDefaults cada vez que se inicia la aplicación.

En lugar de utilizar registerDefaults: que podría utilizar setValue:forKey: y tener mi configuración predeterminada ir al almacén persistente, evitando la necesidad de construir un diccionario & registrarse en cada lanzamiento. Sin embargo, los documentation y sample code de Apple apuntan a registerDefaults:.

Así que estoy tratando de averiguar cuándo y por qué debo usar registerDefaults: y cuándo/por qué debo usar setValue:forKey: en su lugar?

+1

Encontré esta pregunta relacionada: [¿Para qué sirve - [NSUserDefaults registerDefaults:]?] (Http://stackoverflow.com/questions/4931167/what-is-the-use-of-nsuserdefaults-registerdefaults) Si bien las respuestas explican las diferencias, todavía no dicen por qué debería usar una sobre la otra. (Las respuestas parecen ignorar mi pregunta sobre la persistencia). – gabrielk

Respuesta

5

El problema es, por defecto registrados con registerDefaults: no ir a la tienda persistente, por lo que si el usuario nunca cambia sus preferencias estoy leyendo mis preferencias predeterminadas y registrarlas con NSUserDefaults cada vez que se inicie la aplicación.

Sí. ¿Por que eso es un problema? ¿Por qué escribir en el disco cosas que ya tienes en el código?

En lugar de utilizar registerDefaults: Podría utilizar setValue: forKey: y tener mi configuración predeterminada ir al almacén persistente, evitando la necesidad de construir un diccionario & registrarse en cada lanzamiento. Sin embargo, la documentación de Apple y el código de muestra apuntan a registrar valores predeterminados:

Solo si primero marcó "¿este conjunto de valores es correcto? ¿No? Bien, configúrelo ahora". Eso es más código y costo que simplemente usar registerDefaults:.

Debe usar registerDefaults: para establecer los valores predeterminados. Debe usar setValue:forKey: para guardar los valores que están activados.

Recuerde también que NSUserDefaults existe en Mac también. Allí, el usuario puede acceder directamente a la configuración con el comando defaults, por lo que el programa no es la única entidad que puede modificar esta tienda.

+0

Supongo que no es que sea un problema, simplemente parece terriblemente redundante. Si configuro los valores predeterminados y el usuario no los quiere, puede cambiarlos y el cambio se guardará ... y aún tengo que seguir configurando los valores predeterminados. Del mismo modo, si un usuario está satisfecho con los valores predeterminados y no tiene motivos para guardarlos ... Debo seguir configurando los valores predeterminados. Tiene más sentido para mí guardar los valores predeterminados, ya que de todos modos el usuario anularía los predeterminados almacenados.Todavía no veo un caso sólido para usar registerDefaults: – gabrielk

+0

Me resulta especialmente extraño porque los valores predeterminados que quiero se almacenan en el archivo .plist Settings.bundle, pero no se usan como valores predeterminados reales (más como una sugerencia para la GUI cuando se muestran las opciones?). – gabrielk

+1

Aparte del hecho de que se necesita más código para almacenar los valores predeterminados en la tienda (ya que primero debe probar si ya están configurados), guardarlos en la tienda hace que sea imposible cambiar el valor predeterminado en futuras actualizaciones y desperdicios espacio si elimina una configuración durante una actualización. Pero el "es mucho más código para verificar todos los valores predeterminados y luego configurarlos" realmente es la mayor ganancia para los desarrolladores de 'registerDefaults:'. –

Cuestiones relacionadas