Datos básicos: interrupción del ciclo de retención del contexto principal

Digamos que tenemos dos entidades en un modelo de Datos Fundamentales: Departamentos y Empleados.
El Departamento tiene una relación de uno a muchos con los Empleados.

Tengo los siguientes ManagedObjectContexts:
- Raíz: conectado al Coordinador de Tienda Persistente
- Principal: contexto con raíz padre

Cuando quiero crear un empleado, hago lo siguiente:
- Tengo un departamento en el contexto principal.
- Creo un empleado en el contexto principal.
- Asigno el departamento a la propiedad del departamento del empleado.
- Guardo el contexto principal
- Guardo el contexto de la raíz.

Esto crea un ciclo de retención tanto en el contexto Principal como en el contexto Raíz.

Si hice esto sin un contexto secundario (todo en el contexto de Raíz), entonces podría romper el ciclo de retención llamandorefreshObject:mergeChanges en empleado. En mi situación con los dos contextos, todavía podría usar ese método para romper el ciclo en el contexto Principal, pero ¿cómo voy a romper el ciclo en el contexto Raíz?

Nota al margen: este es un ejemplo simple para describir mi problema. En Instrumentos puedo ver claramente el número de asignaciones en aumento. En mi aplicación, tengo contextos que van más allá de un nivel, causando un problema aún mayor, porque obtengo una nueva asignación de entidad con un ciclo de retención por contexto que estoy guardando.

Actualización 15/04: NSPrivateQueueConcurrencyType vs NSMainQueueConcurrencyType
Después de guardar ambos contextos puedo realizarrefreshObject:mergeChanges en el contexto Principal con el objeto Departamento. Esto, como se espera, volverá a culpar al objeto del Departamento, romperá el ciclo de retención y desasignará las entidades del Departamento y del Empleado en ese contexto.

El siguiente paso es romper el ciclo de retención que existe en el contexto de la raíz (al guardar el contexto principal se han propagado las entidades al contexto de la raíz). Puedo hacer el mismo truco aquí y usarrefreshObject:mergeChanges en el contexto raíz con el objeto Departamento.

Lo extraño es que esto funciona bien cuando mi contexto Root se crea con NSMainQueueConcurrencyType (todas las asignaciones se vuelven a fallar y se desasignan), pero no funciona cuando mi contexto Root se crea con NSPrivateQueueConcurrencyType (todas las asignaciones se fallan, perono desasignado).

Nota al margen: todas las operaciones para el contexto raíz se realizan en una llamada a performBlock (AndWait)

Actualización 15/04: Parte 2
Cuando hago otra acción (inútil, porque no hay cambios) guardar o deshacer en el contexto de la raíz con NSPrivateQueueConcurrencyType, los objetos parecen estar desasignados. No entiendo por qué esto no se comporta igual que NSMainQueueConcurrencyType.

Actualización 16/04: proyecto demo
He creado un proyecto de demostración:http://codegazer.com/code/CoreDataTest.zip

Actualización 21/04: Cómo llegar
Gracias Jody Hagings por tu ayuda!
Estoy tratando de mover elrefreshObject:mergeChanges fuera de mi objeto administradodidSave metodos

¿Podría explicarme la diferencia entre:

[rootContext performBlock:^{
    [rootContext save:nil];
    for (NSManagedObject *mo in rootContext.registeredObjects)
        [rootContext refreshObject:mo mergeChanges:NO];
}];

y

[rootContext performBlock:^{
    [rootContext save:nil];
    [rootContext performBlock:^{
        for (NSManagedObject *mo in rootContext.registeredObjects)
            [rootContext refreshObject:mo mergeChanges:NO];
    }];
}];

El de arriba no desasigna los objetos, el de abajo lo hace.

Respuestas a la pregunta(3)

Su respuesta a la pregunta