2012-08-08 9 views
6

childContext y parentContext son ambos de "NSMainQueueConcurrencyType"anidada NSManagedObjectContext guardar y IDobjeto

[childContext performBlock:^(void) { 
    [childContext save:NULL]; 

    [parentContext performBlock:^(void) { 
    [parentContext save:NULL]; 
    // Why is objectID for the inserted NSManagedObject still a temporary one here? 
    }]; 
}]; 

Pregunta:

  1. ¿Es este el camino correcto para salvar tanto para el niño y el contexto de los padres
  2. ¿Por qué se Es que después de guardar, el objectID de NSManagedObject insertado sigue siendo uno temporal?

Respuesta

3

Puedo pensar en algunas ocasiones excepcionales en las que desearía tener un MOC de cola principal como hijo de otro MOC de cola principal, pero ver eso seguro me pide preguntar: ¿Cuál es la ventaja de tener ambos de ellos, NSMainQueueConcurrencyType?

Además, este es un error conocido (al menos se ha informado varias veces). Cuando inserta y guarda desde un contexto secundario, solo el identificador directamente conectado a la tienda persistente obtiene sus ID mutados. Por lo tanto, al guardar elementos recién insertados, tiene varias opciones.

  1. Adquiera ID persistentes antes de guardar.
  2. Llame al [moc refreshObject:object mergeChanges:NO] y configure todas las referencias a nil.
  3. Adquirir identificadores persistentes después de la mayor parte de los padres ahorra

prefiero # 3, ya que requiere una inmersión en la base de datos. Si lo haces después, puede obtenerlos del padre.

+1

Responder a la pregunta en su respuesta: crear un MOC infantil como un "área de preparación" para una serie de cambios, lo que permite que se guarden o se rechacen atómicamente. (En otras palabras, si el usuario toca el botón Cancelar, simplemente descarta el MOC sin guardarlo). – benzado

Cuestiones relacionadas