ios performance nsuserdefaults

ios - ¿Cuándo y por qué debería usar el método synize() de NSUserDefaults?



performance (4)

Así que he echado un vistazo a la documentación de Apple sobre el método synize () de NSUserDefaults. Ver abajo para referencia:

https://developer.apple.com/reference/foundation/userdefaults/1414005-synchronize

La página lee actualmente:

Debido a que este método se invoca automáticamente a intervalos periódicos, use este método solo si no puede esperar la sincronización automática (por ejemplo, si su aplicación está a punto de salir) o si desea actualizar los valores predeterminados del usuario a lo que está en el disco aunque No ha realizado ningún cambio.

Sin embargo, lo que todavía no entiendo es cuándo debería llamarse este método. Por ejemplo, ¿debería llamarse cada vez que el usuario cambia la configuración de la aplicación? ¿O debería confiar en que la API de fondo se encargará de eso? ¿Y el abandono de la vista inmediatamente después de un cambio de configuración en la memoria resulta en la pérdida de ese cambio?

Además, ¿cuándo podría una falla al llamar a sync () que la configuración del usuario no se cambie correctamente?

Además, ¿cuál es el costo (rendimiento, memoria u otro) de llamar a este método? Sé que implica leer y escribir desde / hacia el disco, pero ¿eso realmente requiere tanto esfuerzo en los teléfonos?


Hasta donde sé, sincronizar se usa para sincronizar los datos de inmediato, pero iOS puede manejarlo de manera inteligente. Por lo tanto, no necesita llamarlo siempre. Si lo llamas cada vez, se convertirá en un problema de rendimiento.

Consulte la documentación de Apple: Enlace oficial


La documentación de Apple para synchronize() se ha actualizado y ahora dice:

Espera cualquier actualización asincrónica pendiente de la base de datos predeterminada y regresa; Este método es innecesario y no debe utilizarse .


Parece haber tanta confusión sobre los valores predeterminados del usuario. Piénsalo de esta manera. Es esencialmente lo mismo que tener un diccionario global disponible en toda su aplicación. Si agrega / edita / elimina una clave / valor al diccionario global, ese cambio es inmediatamente visible en cualquier parte de su código. Dado que este diccionario está en la memoria, todo se perdería cuando su aplicación finalice si no se conserva en un archivo. NSUserDefaults persiste automáticamente el diccionario en un archivo de vez en cuando.

La única razón por la que hay un método de synchronize es para que su aplicación pueda decirle a NSUserDefaults que persista el diccionario "ahora" en lugar de esperar el guardado automático que eventualmente sucederá.

Y la única razón por la que necesita hacer eso es porque su aplicación podría finalizar (o bloquearse) antes del próximo guardado automático.

En mis propias aplicaciones, el único lugar al que llamo synchronize es en el método de delegado applicationDidEnterBackground . Esto es para garantizar que los últimos cambios no guardados se mantengan en caso de que la aplicación finalice mientras está en segundo plano.

Creo que gran parte de la confusión proviene de la depuración de una aplicación durante el desarrollo. No es raro durante el desarrollo que elimine la aplicación con el botón "detener" en el depurador. Y muchas veces esto sucede antes de que los cambios más recientes de NSUserDefaults hayan persistido. Así que he desarrollado el hábito de poner mi aplicación en segundo plano presionando el botón de Inicio antes de eliminar la aplicación en el depurador cada vez que quiero asegurarme de que las últimas actualizaciones persisten.

Dado el resumen anterior, revisemos sus preguntas:

¿debería llamarse cada vez que el usuario cambia la configuración de la aplicación?

No. Como se describió anteriormente, cualquier cambio está disponible automáticamente de inmediato.

¿O debería confiar en que la API de fondo se encargará de eso?

Sí, confíe en la persistencia automática con la excepción de la synchronize de llamadas cuando su aplicación ingrese en segundo plano.

¿Y el abandono de la vista inmediatamente después de un cambio de configuración en la memoria resulta en la pérdida de ese cambio?

Esto no tiene efecto. Una vez que agrega / edita / elimina una clave / valor en NSUserDefaults , se realiza el cambio.

Además, ¿cuándo podría una falla al llamar a sync () que la configuración del usuario no se cambie correctamente?

El único momento en que se puede perder un cambio es si su aplicación finaliza antes de que los últimos cambios hayan persistido. Llamar a synchronize cuando su aplicación ingresa en segundo plano resuelve la mayoría de estos problemas. El único problema posible restante es si su aplicación falla. Se perderán todos los cambios no guardados que aún no se hayan persistido. Arregla tu aplicación para que no se bloquee.

Además, ¿cuál es el costo (rendimiento, memoria u otro) de llamar a este método? Sé que implica leer y escribir desde / hacia el disco, pero ¿eso realmente requiere tanto esfuerzo en los teléfonos?

La persistencia automática se realiza en segundo plano y simplemente escribe un diccionario en un archivo plist. Es muy rápido a menos que no siga las recomendaciones. Será más lento si está haciendo NSUserDefaults mal uso de NSUserDefaults para almacenar grandes cantidades de datos.


ACTUALIZAR

Como se anticipó, ha quedado en desuso como se menciona en Apple Doc.

sincronizar()

Espera cualquier actualización asincrónica pendiente de la base de datos predeterminada y regresa; Este método es innecesario y no debe utilizarse.

Respuesta original

synchronize va a quedar en desuso como se menciona here

- sincronizar está en desuso y se marcará con la macro NS_DEPRECATED en una versión futura.

-synchronize bloquea el hilo de llamada hasta que se hayan completado todas las operaciones de conjunto en progreso. Esto ya no es necesario. Los reemplazos para usos anteriores de -synchronize dependen de cuál fue la intención de llamar a sincronizar. Si sincronizaste ...

-… antes de leer para obtener valores actualizados: elimine la llamada de sincronización

- ... después de escribir para notificar a otro programa que lea: el otro programa puede usar KVO para observar el valor predeterminado sin necesidad de notificar - ... antes de salir en un proceso que no sea de aplicación (herramienta de línea de comando, agente o demonio): llame a CFPreferencesAppSynchronize (kCFPreferencesCurrentApplication)

- ... por cualquier otro motivo: elimine la llamada de sincronización