2010-01-26 13 views
9

Tengo una aplicación de iPhone basada en Core Data que necesita guardar 1000 objetos administrados en la terminación. Esto lleva 8+ segundos, sin embargo, el sistema operativo mata la aplicación si no se completa en aprox. 6 segundos.¿Guardado de fondo con datos centrales?

No quiero guardar los objetos antes, porque entonces el usuario tiene que esperar 8 segundos más para que se muestren los resultados.

¿Es posible de alguna manera guardar los objetos anteriormente en un subproceso en segundo plano, mientras todavía tiene acceso (de solo lectura) al NSManagedObjectContext en el subproceso principal para mostrar los datos? ¿O es de alguna manera posible duplicar los objetos administrados y pasar los duplicados a un hilo de fondo para guardar?

Para aclarar, esto es lo que sucede en la aplicación ahora: Tengo un hilo de fondo que importa más de 1000 objetos en aproximadamente 1 segundo. Si guardo durante la importación, tarda mucho más de 1 segundo. Por lo tanto, para mostrar esos elementos con la mínima demora, el contexto se transfiere sin guardar al hilo principal, y el usuario obtiene sus resultados lo más rápido posible.

Ahora tengo el problema de cómo guardar estos objetos sin que el usuario tenga que esperar los 8 segundos. Si guardo en el hilo de fondo antes de la entrega, el usuario tiene que esperar. Si guardo en el hilo de primer plano después de la entrega, el usuario tiene que esperar. Los únicos dos enfoques posibles que puedo ver en este momento son:

  1. alguna manera con los datos básicos que hacen su sqlite accesos en el fondo, sin dejar de mantener el hilo principal reactiva
  2. Entregando los objetos no guardados de un contexto a otro, y guardar en el hilo de fondo

Ambos enfoques parecen imposibles (al menos según la documentación de Core Data). Entonces, ¿no hay otra solución que hacer que el usuario espere más tiempo (y tal vez muestre un buen reloj de arena giratorio :-)?

Saludos, Jochen

Respuesta

8

Sí, hay una manera de salvar el contexto de objeto gestionado desde el subproceso de fondo, o, más precisamente, se refiere generalmente como "importación en el subproceso en segundo plano, y mostrando en el hilo principal " De esta forma, los objetos gestionados se guardan pieza por pieza cuando se importan, no todos a la vez en la terminación.

Acabo de escribir una respuesta breve sobre una pregunta similar aquí en SO, pero debe leer este Apple doc. Hay muchas trampas potenciales, así que lea muy, muy cuidadosamente. Y luego lea Apple's "Efficiently Importing Data". ¡Esta es una lectura obligada! Y el CoreData book de Marcus Zarra también es útil.

CoreData multihilo es un poco complicado, pero realmente vale la pena. ¡Buena suerte!

+3

De acuerdo. Guardarlos mientras realiza la importación es mucho más eficiente que hacer un ahorro masivo al salir. También realicé una buena guía de importación en Mac Developer Network que incluso explica cómo guardar el fondo. –

+1

Gracias por la ayuda. Intenté guardar durante la importación, con el resultado de que el tiempo de importación aumenta. Es más rápido que guardar al final, pero aún no lo suficientemente rápido. He aclarado la pregunta sobre este asunto, y estoy seguro de que estoy de acuerdo en que Multi-threading de Core Data es engañoso ... – Jochen

+0

Tu 1. debería ser posible. Simplemente haga un 'NSManagedObjectContext' por hilo. Y al importar en segundo plano, no cree todas las más de 1000 entidades a la vez y guárdelo de una vez. En su lugar, cree 10 entidades en el contexto, guárdelas, páselos al hilo principal y repita este proceso.El usuario no puede ver más de 1000 entradas al mismo tiempo en cualquier caso, por lo que puede engañar a su usuario de esa manera que todos los datos estén disponibles. – Yuji

Cuestiones relacionadas