¿Necesita un padre de Core Data ManagedObjectContext compartir un tipo de concurrency con el context secundario?

¿Puedo establecer el context principal de mi ManagedObjectContext en un ManagedObjectContext con un tipo de concurrency diferente? Por ejemplo:

backgroundManagedObjectContext_ = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [backgroundManagedObjectContext_ setPersistentStoreCoordinator:coordinator]; managedObjectContext_ = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [managedObjectContext_ setParentContext:backgroundManagedObjectContext_]; 

Mi objective es (con suerte) get una guardada rápida para managedObjectContext_ (ya que solo necesita save cosas en el context primario en memory) y luego hacer que el backgroundManagedObjectContext_ se guarde en su propia queue. A less que tenga que hacer otro save desde la queue de "primer plano" antes de que el background se guarde, mi usuario nunca debería ver times de guardado prolongados.

Estoy encontrando lo que parecen interlockings, pero no estoy seguro si están relacionados con esto, o si mi problema está en otro lado.


Detalles para el único lugar donde puedo producir el estancamiento de forma más o less confiable:

Tengo un context de object gestionado para el hilo principal, está respaldado por un context de object gestionado con un tipo de concurrency de queue privada y ese tiene un almacenamiento persistente.

Tengo un puñado de types de entidad (aproximadamente 5), cada uno con una o dos relaciones bidireccionales con otra entidad.

Mi aplicación quiere usar iCloud (tengo ese código marcado para estas testings), por lo que no puede enviarse con una database pre-poblada, debe buildla cuando detecta una vacía.

Así que cuando veo una database vacía (esta está marcada en el hilo principal) agrego alnetworkingedor de 4 u 8 de todos los types de entidad excepto uno, y el último obtiene alnetworkingedor de 100 (todas las agregaciones suceden en el hilo principal). El hilo principal hace un saveContext. Después de eso, se completa (sin errores) solicita al otro context de object gestionado que ejecute un bloque que también hace un saveContext. Este saveContext es definitivamente un participante interlocking. Este también es el ÚNICO material hecho con el "background" NSManagedObjectContext en absoluto.

El flujo de control exacto es un poco turbio después de esto, ya que un NSFetchedResultsController (todo tipo de entidad dada (que tiene ~ 3 miembros) con una sorting simple y un tamaño de lote de 20 o más) impulsa la siguiente ronda de actividad de Datos centrales , pero hay una llamada del TableViewController preguntando cuántos elementos necesita administrar, que es "cuántos resultados tiene el controller de resultados obtenidos". Esa llamada es el otro lado del punto muerto. (todo esto está en el hilo principal)

Según mi experiencia, esto no es necesario siempre que ambos contexts implementen el NSMainQueueConcurrencyType o el NSPrivateQueueConcurrencyType . Lo importante es recordar que al interactuar con contexts de objects gestionados a través de múltiples subprocesss, todos los posts enviados al context deben enviarse mediante -performBlock: o performBlockAndWait:

En un proyecto reciente, tenía un NSManagedObjectContext padre que respaldaba un NSFetchedResultsController que se había creado con el NSMainQueueConcurrencyType . Desde allí, creé un NSManagedObjectContext con el NSPrivateQueueConcurrencyType y establecí el context con el NSMainQueueConcurrencyType como el elemento primario. Ahora, el context de mi hijo podría contener ediciones descartables cuando agrega un nuevo object que eventualmente terminará en la vista de tabla respaldada por el NSFetchedResultsController que está respaldado por el context padre. Cuando estaba listo para save mis ediciones y hacerlas coincidir con el context principal, el código se veía así.

 // Save the child context first [childContext performBlock:^{ NSError *error = nil; [childContext save:&error]; // Save the changes on the main context [parentContext performBlock:^{ NSError *parentError = nil; [parentContext save:&parentError]; }]; }]; 

Ahora no puedo decir con certeza que esta es la forma correcta de hacerlo porque la documentation sobre esto es bastante escasa en este momento. Podría ser útil si pudiera mostrar algún código que cree que causa interlockings. Si está en el progtwig de desarrolladores, es posible que desee consultar los videos de la session de WWDC con respecto a los datos básicos de este año. Creo que hay dos, uno para Mac OS X y otro para iOS, que básicamente tocan las mismas ideas, pero cada una también contiene información única.