Problema con el código de pila de datos del núcleo generado por xCode y el código de muestra de datos del núcleo

StackOverflow https://stackoverflow.com/questions/1408493

  •  05-07-2019
  •  | 
  •  

Pregunta

En el código generado para la pila de datos del núcleo, se llama a guardar en managedObjectContext en el método applicationWillTerminate. Esto es para cuidar de todos los objetos no guardados en el contexto antes de salir.

Esto también tiene un efecto secundario no deseado de guardar cualquier objeto temporal. (Este problema también está visible en los códigos de muestra de Apple. Si hace clic en + para agregar una Receta en el código de muestra de Receta, y luego presiona el botón de Inicio para finalizar la aplicación, la Receta estará lista cuando se inicie la próxima vez. ).

¿Cuál es el patrón de diseño preferido para manejar este problema? Podría pensar en lo siguiente.

  1. Utilice un scratchpad managedObjectContext diferente para objetos temporales y cuando decida realmente Guardar, luego presione una copia en el managedObjectContext principal. Llame a guardar solo en el archivo gestionado principal de ApplicationObjectContext en la aplicación WillTerminate. (¿Existe alguna forma fácil y rápida de mover un objeto de un evento gestionado de objeto a otro, además de crear una copia manualmente en el nuevo contexto?)
  2. Elimine guardar de applicationWillTerminate, pero asegúrese de que todos los Objetos se guarden inmediatamente después de realizar los cambios. (Esto puede no ser fácil todo el tiempo, tengo una aplicación de pestañas, un usuario puede haber iniciado operaciones de edición al mismo tiempo).

Hazme saber si hay una mejor manera de manejar esto.

¿Fue útil?

Solución

La solución 1 no implica copiar objetos. El patrón se ilustra en el ejemplo de CoreDataBooks . Puede crear nuevos objetos en un segundo contexto, luego colocarlos en el contexto principal directamente (utilizando objectWithID :) o (como se muestra y explica en el ejemplo) observando NSManagedObjectContextObjectsDidChangeNotification y combinando los cambios en su contexto principal.

Otros consejos

La solución 1 implica copiar completamente los objetos. Sin embargo, copiar un objeto es complicado. Las propiedades se pueden manejar fácilmente, pero las relaciones son sutiles. Para copiar relaciones (una copia profunda, no una superficial), necesita un procedimiento recursivo, en el que siempre se cuida de no volver a copiar el mismo objeto una y otra vez si alguna vez se encuentra nuevamente durante el paso de recursión.

La solución 2 puede ser más fácil de implementar dependiendo de la lógica de su aplicación y, como se señaló, GUI.

Hay una tercera posibilidad para manejar correctamente los objetos temporales de la siguiente manera. Agregue una propiedad booleana a la entidad asociada a sus objetos que realiza un seguimiento del estado del objeto (temporal o no). Luego, utilizando los métodos NSManagedObjectContext

- (NSSet *)insertedObjects

simplemente se enumera el conjunto de objetos y, dependiendo del valor de la bandera booleana, guardar o eliminar el objeto.

Tenga en cuenta que esto puede ser bastante caro dependiendo del número de objetos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top