¿Cuándo usar NSMainQueueConcurrencyType de Core Data?

¿Está inicializando un NSManagedObjectContext usando NSMainQueueConcurrencyType solo para la situación donde ese MOC tiene un MOC hijo que se inicializó usando NSPrivateQueueConcurrencyType ?

Para dar algunos antecedentes: mi aplicación tiene una estructura tradicional en la que la vista de tabla principal está controlada por un NSFetchedResultsController y los datos se importan de forma asíncrona desde un service web utilizando una subclass NSOperation que tiene su propio MOC. No estaba seguro de si ambos MOC en esa situación deberían usar NSConfinementConcurrencyType (el valor pnetworkingeterminado, creo) o si el MOC asociado con el controller de resultados traído en el hilo principal debería usar NSMainQueueConcurrencyType y el background MOC debería usar NSConfinementConcurrencyType .

Primero, una receta en los nuevos types de contexts de Core Data.

NSMainQueueConcurrencyType crea un context asociado con la queue de envío principal y, por lo tanto, con el subprocess principal. Podría usar dicho context para vincularlo a los objects que se requieren para ejecutarse en el hilo principal, por ejemplo, elementos de interfaz de usuario.

NSPrivateQueueConcurrencyType crea y administra una queue de envío privado para operar. Debe usar los nuevos methods performBlock: o performBlockAndWait: El context ejecutará los bloques pasados ​​en su propia queue privada.

Finalmente, NSConfinementConcurrencyType es el tipo pnetworkingeterminado y solo se puede usar dentro del subprocess donde se creó. Entonces, dentro de su NSOperation , lo ha usado de la manera correcta. Una simple nota Si desea utilizarlo como context secundario, necesita tener un "context de queue" ( NSMainQueueConcurrencyType o NSPrivateQueueConcurrencyType ).

Ahora sobre su pregunta.

¿Está inicializando un NSManagedObjectContext usando NSMainQueueConcurrencyType solo para la situación donde ese MOC tiene un MOC hijo que se inicializó usando NSPrivateQueueConcurrencyType?

No, no es necesario Sí, puede configurar un context privado que funcione en segundo plano y luego empuja los objects recuperados al principal, pero haré lo contrario: use un NSPrivateQueueConcurrencyType como el context maestro y el NSMainQueueConcurrencyType como context secundario para el primero . De esta manera, el context principal se ocupará solo de los objects que están en la memory. Los files guardados en disco los realiza únicamente la queue privada.

Este enfoque es utilizado por la class UIManagedDocument . Guardar en disco se realizan en un hilo de background (una queue privada). De esta manera, la IU no se congela.

NSMainQueueConcurrencyType es principalmente para los contexts vinculados a la interfaz de usuario.

Para mantener la interfaz de usuario sensible, la mayor parte de la lógica de negocios se realiza mejor en subprocesss de background y en contexts de "background". Pero la interfaz de usuario en sí necesitará usar un context en algún momento, es decir, NSMainQueueConcurrencyType .

Los contexts NSMainQueueConcurrencyType con NSMainQueueConcurrencyType son muy adecuados para editar paneles donde los cambios se pueden save de una vez, es decir, comprometidos con el context principal. El padre no necesita usar NSMainQueueConcurrencyType .

NSConfinementConcurrencyType es el tipo pnetworkingeterminado. Vincula el context al hilo actual, a menudo es el hilo principal por cierto. No debe confiar en el tipo pnetworkingeterminado sino en las aplicaciones más simples. NSMainQueueConcurrencyType y NSPrivateQueueConcurrencyType son los mejores ya que sabe exactamente qué queue está en uso para cada context.