standard from cocoa limit nsuserdefaults options

cocoa - from - Cuándo(no) abusar de NSUserDefaults



swift 4.2 userdefaults (5)

Me pregunto cuáles son las pautas para:
1 - con qué frecuencia puedo leer de NSUserDefaults
2 - ¿Cuántos datos puedo almacenar razonablemente en NSUserDefaults?

Obviamente, hay límites a la cantidad de NSUserDefaults que se pueden usar, pero tengo problemas para determinar qué es razonable y qué no.

Algunos ejemplos entre otros:

  • Si mi juego tiene una opción para que la computadora sea uno de los jugadores, usaré NSUserDefaults para guardar ese valor booleano. Eso queda claro. ¿Pero también es razonable acceder a NSUserDefaults durante mi juego cada vez que quiero saber si la computadora es un jugador o debo usar una variable de instancia para eso? Supongamos que necesito comprobar ese booleano cada segundo. ¿Es la respuesta la misma es que es 100 ms en su lugar? ¿Qué pasa con cada 10 s?

  • Si mi juego tiene 50 objetos en movimiento y quiero que sus posiciones y velocidades se almacenen cuando el usuario abandona la aplicación, ¿es NSUserDefaults un lugar razonable para almacenar esos datos? ¿Qué tal unos 20 objetos en movimiento? ¿Qué hay de unos 200?


Me pregunto para qué sirven las pautas: 1: con qué frecuencia puedo leer de NSUserDefaults

con bastante regularidad espera que la sobrecarga de los valores predeterminados sea similar a un NSDictionary seguro para subprocesos

2 - ¿Cuántos datos puedo almacenar razonablemente en NSUserDefaults?

Físicamente, más de lo que necesitarás. el máximo lógico es qué tan rápido lo necesita y cuánto espacio ocupa en el disco. también recuerde que esta representación se lee y se escribe en el disco en el inicio / cierre y varias otras veces.

Si mi juego tiene una opción para que la computadora sea uno de los jugadores, usaré NSUserDefaults para guardar ese valor booleano. Eso queda claro. ¿Pero también es razonable acceder a NSUserDefaults durante mi juego cada vez que quiero saber si la computadora es un jugador o debo usar una variable de instancia para eso?

solo agrega un const bool al objeto oponente. Pérdida de tiempo de ejecución cero, aparte de la memoria, que no será significativa.

Supongamos que necesito comprobar ese booleano cada segundo. ¿Es la respuesta la misma es que es 100 ms en su lugar? ¿Qué pasa con cada 10 s?

de nuevo, es como un NSDictionary (hashing) seguro para subprocesos. será bastante rápido, y lo suficientemente rápido para leer a esa frecuencia. Si es el mejor diseño o no depende del programa. Si se vuelve enorme, entonces sí, el rendimiento sufrirá.

Si mi juego tiene 50 objetos en movimiento y quiero que sus posiciones y velocidades se almacenen cuando el usuario abandona la aplicación, ¿es NSUserDefaults un lugar razonable para almacenar esos datos? ¿Qué tal unos 20 objetos en movimiento? ¿Qué hay de unos 200?

estaría bien, aunque no leería / escribiría a través de los valores predeterminados del usuario durante el juego; simplemente guardar / cargar el estado según sea necesario.

No recomiendo guardar todo esto en los valores predeterminados del usuario. simplemente cree una representación de archivo para el estado de su juego y use los valores predeterminados del usuario para lo que está diseñado. Si es enorme y se escribe a menudo, la implementación puede vaciar el estado en el disco con regularidad, lo que podría llevar un tiempo relativamente largo.


Cientos a miles de artículos están bien en NSUserDefaults (es básicamente un ajuste alrededor de la serialización de la lista de propiedades). Con respecto a la sobrecarga de su aplicación, lo mejor que puede hacer es intentarlo y usar un generador de perfiles.


El principal problema de rendimiento que nadie menciona aquí es que el directorio de inicio del usuario puede estar en un volumen de red y puede no ser particularmente rápido. No es una situación ideal, pero sucede, por lo que si te preocupa el rendimiento, deberías probar contra eso.

Dicho esto, NSUserDefaults utiliza un caché en memoria, y el costo solo se incurre al sincronizar. Según la documentación, la sincronización se realiza "automáticamente ... a intervalos periódicos"; Sin embargo, creo que esto solo se aplica si algo ha cambiado.

Por lo tanto, para el caso de verificar si la computadora es un reproductor, usar NSUserDefaults una vez que un marco no debería ser un problema, ya que se almacena en caché. Para almacenar el estado del juego, puede ser un problema de rendimiento si lo actualizas constantemente, y como Peter Hosey dice que es un abuso semántico.


NSUserDefaults es básicamente un contenedor para cargar un NSDictionary desde un archivo .plist desde el disco (y también escribirlo en el disco). Puede almacenar tantos datos en NSUserDefaults, pero tiene poco control sobre la cantidad de memoria que utiliza y cómo se lee desde el disco.

Yo usaría diferentes tecnologías para diferentes información / datos.

  • Pequeños fragmentos de datos de servidores, preferencias, información del usuario, etcétera, usaría NSUserDefaults.

  • Para la información de inicio de sesión (tokens de acceso, datos confidenciales), usaría el llavero. El llavero también podría usarse para datos que no deberían eliminarse cuando se elimina la aplicación.

  • Para grandes cantidades de datos de servidor o datos de juegos, los escribiría en el disco, pero los mantendré en la memoria.

En su situación, lo mantendría en la memoria (probablemente una propiedad @), pero periódicamente lo escribiría en el disco (tal vez cada 1 a 5 veces cambie, use un int ivar). Asegúrese de que este método de escritura en el disco esté en AppDelegate, para que no falle cuando cierre el controlador de vista que lo está ejecutando.

De esta manera, se puede acceder fácilmente a los datos, pero también se guardan en el disco para mantenerlos seguros.


No te preocupes por los límites. En su lugar, hazte esta simple pregunta:

¿Es esta una preferencia?

Si es una preferencia, entonces debería estar en los valores predeterminados del usuario. Para eso están los valores predeterminados del usuario. De lo contrario, debe estar en el directorio Documentos (o, en Mac, posiblemente en Soporte de aplicaciones).

En iOS, puede decir si es una preferencia o no si sería apropiado (si es posible) colocarlo en su paquete de configuración para mostrarlo y editarlo en la aplicación Configuración. En Mac OS X, normalmente puede saber si es una preferencia o no si sería apropiado colocarlo en la ventana Preferencias.

Por supuesto, eso depende de tu juicio. Stanza para Mac, por ejemplo, se equivoca al poner las no preferencias en su ventana de Preferencias.

También puede considerar la pregunta por su inverso:

¿Son estos datos creados por el usuario?

Una preferencia para la cual tendrá un valor predeterminado no es la información creada por el usuario; es información anulada por el usuario. No menos malo perderlo, pero le informa dónde debe guardarlo.