2010-07-07 13 views
9

Estoy desarrollando una aplicación de iPhone, encuentro un problema en el iOS4 debido a la tarea múltiple.¿Cómo obtener una actualización NSUserDefault en iOS 4?

Esta aplicación tiene la configuración predeterminada definida en un conjunto de configuraciones. Si ejecuto mi aplicación, entonces la dejé (por lo que queda en segundo plano). Cambiaré la configuración y reiniciaré la aplicación (sale del modo de espera y el método: se llama a applicationDidBecomeActive()).

Los valores en NSUserDefault no son actualizaciones, pero cuando salgo de la aplicación y reinicio. Los valores son buenos

¿Alguien tiene el mismo problema que yo? ¿Qué es lo que estoy haciendo algo mal?

Gracias por su asesoramiento/ayuda.

+0

¿Actualiza los valores predeterminados una vez que su aplicación se vuelve a activar? Si no lo eres, entonces deberías reemplazarlos en el fondo. – iwasrobbed

Respuesta

20

que tenían el mismo problema que tú, y tiene alrededor de ella llamando

[[NSUserDefaults standardUserDefaults] synchronize]; 

en applicationDidBecomeActive.

Por alguna razón, el objeto [NSUserDefaults standardUserDefaults] al que puede acceder en su aplicación no está sincronizado con los archivos plist reales que lo respaldan cuando una aplicación se vuelve a activar después de haber sido suspendida. Llamar al método synchronize fuerza una sincronización.

+0

Es importante destacar que se DEBE llamar a la sincronización después de cambiar NSUserDefaults si desea escribir esos cambios en un archivo. Si no lo hace, los cambios serán simplemente almacenados en la memoria. – Goles

+1

@ Mr.Gando Eso no es verdad. 'NSUserDefaults' también se sincroniza periódicamente para archivar automáticamente. –

3

Necesita escuchar los cambios de configuración. La mejor manera de hacerlo es establecer un oyente siempre que lo necesite:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(settingsChanged) name:NSUserDefaultsDidChangeNotification object:nil]; 

Lo único que se necesita para asegurarse de que es usted no cambio cualquier configuración en su oyente, o se obtiene recursión infinita sin agregar un poco más de lógica.

Me mantendría alejado de la sincronización porque en mi experiencia descubrí que tenía que ejecutarlo dos veces. Pero eso es un comportamiento accidental. Un oyente le notificará cuando la nueva configuración haya sido releída de la tienda.

+0

La desventaja de usar esto, es que también se dispara cuando usted mismo cambia algo acerca de 'NSUserDefaults'. Entonces, cada vez que llamas a '[[NSUserDefaults standardUserDefaults] setObject: someObject forKey: @" someKey "]' esta notificación se transmite y se llama al método. Que no es lo que yo (y presumiblemente el que pregunta) quiere. Además, no he tenido ningún problema con 'synchronize', llamándolo solo una vez funcionó bien. –

+0

De esta manera es obviamente mejor. Simplemente actualice los valores predeterminados del usuario y cambie el comportamiento solo en el observador de notificaciones. Y también, debe aplicar cualquier cambio de desactivación del usuario en tiempo real durante la ejecución de la aplicación con la multitarea de iOS4. – Eonil

Cuestiones relacionadas