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