2010-06-21 15 views
12

Estoy trabajando en una aplicación respaldada por Core Data. En este momento, guardo el Contexto de objeto como y cuando agrego o elimino una entidad desde y hacia el Contexto. Me temo que afectará el rendimiento, así que estaba pensando en retrasar el ahorro. De hecho, podría retrasarlo hasta que la aplicación termine. ¿Es demasiado arriesgado guardar los datos solo cuando la aplicación está a punto de cerrarse? ¿Con qué frecuencia debo llamar al guardado en el contexto del objeto?¿Con qué frecuencia debo guardar en Core Data?

Estaba pensando en tener un hilo separado para manejar el guardado: esperará en un semáforo. Cada vez que cualquier parte de la aplicación llama a un método auxiliar/util para guardar los datos centrales, disminuirá el semáforo. Cuando se reduce a cero, el "hilo de guardado" hará un salvado una vez e incrementará el semáforo a, por ejemplo, 5, y luego dormirá nuevamente.

¿Alguna buena recomendación? Gracias!

Respuesta

9

Debe guardar con frecuencia. El rendimiento real de la operación de guardar tiene mucho que ver con el tipo de tienda persistente que está utilizando. Como las tiendas binarias y XML son atómicas, deben reescribirse completamente en el disco cada vez que se guarde. A medida que crece su gráfico de objetos, esto realmente puede ralentizar su aplicación. La tienda SQLite, por otro lado, es mucho más fácil de escribir de forma incremental. Entonces, aunque habrá algunas cosas que se escribirán por encima y más allá de los objetos que está guardando, la sobrecarga es mucho menor que con los tipos de tienda atómica. El ahorro que afecta solo a unos pocos objetos siempre será rápido, independientemente del tamaño general del gráfico del objeto.

Dicho esto, si está importando datos en un bucle, digamos que esperaría hasta el final de la operación completa para guardar en lugar de guardar en cada iteración. Su objetivo principal debe ser evitar la pérdida de datos. (¡He descubierto que a los usuarios no les importa tanto!) El rendimiento debería ser un segundo cercano. Es posible que tenga que trabajar para equilibrar la frecuencia del ahorro con el rendimiento, pero la solución que describe anteriormente parece exagerada a menos que haya identificado un problema de rendimiento específico y significativo.

+0

Gracias por la respuesta rápida. Mis objetos no son enormes, pero el objeto es un poco complicado. La tienda subyacente es SQLite, así que como dijiste, debería estar bastante bien. Hay un problema adicional que encontré recientemente: creo un objeto de entidad en el contexto y lo guardo. En un breve momento, si borro esa entidad (recuperada más tarde usando un FetchedResultsController), obtendría un error que tiene algo que ver con la consistencia interna. Creo que es porque el contexto no ha actualizado el gráfico de objetos en la memoria. – Justin

+1

Me gustaría añadir a esto que desea hacer que su frecuencia de guardado real sea una variable o un '# define', de modo que una vez que esté en pruebas puede ajustar su frecuencia de guardado y ver los resultados en Instruments. –

0

La mejor manera que pienso, es guardar después de cada objeto. Si algo sucede alguna vez, como un choque repentino, nada se perderá.

Algunas mejoras de rendimiento, si agrega muchos objetos, es por lotes. Agregue todos los objetos al contexto que guarde. Esto es bueno, por ejemplo, si agrega muchos objetos en un bucle. Su idea es similar, pero podría pasar mucho tiempo entre las copias guardadas, en las que el programa podría fallar.

No creo que agregar un solo objeto sea un gran problema de rendimiento. ¿Qué tan grandes son tus objetos? ¿Contienen una gran cantidad de datos?

+0

NUNCA guardar después de cada bloqueo. Eso mata el rendimiento muerto. –

+1

¿Guardar después de cada bloqueo? Creo que es un error tipográfico Seguramente si el usuario está dictando las salvaciones mediante la creación de objetos, el usuario no podría crear objetos lo suficientemente rápido como para ralentizar la aplicación. Si cree que ralentiza su aplicación lo suficiente como para correr el riesgo de no ahorrar lo suficiente. Proporcione evidencia, todos mis puntos de referencia han sido aceptables. –