usar objective funciona datos data cuando como iphone ios cocoa-touch core-data nsmanagedobjectcontext

iphone - objective - ¿Cuándo usar NSMainQueueConcurrencyType de Core Data?



ios 12 core data (2)

¿Inicializar un NSManagedObjectContext utilizando NSMainQueueConcurrencyType solo para la situación en la que ese MOC tiene un MOC secundario que se inicializó utilizando NSPrivateQueueConcurrencyType ?

Para dar algunos antecedentes: mi aplicación tiene una estructura tradicional según la cual la vista de tabla principal es impulsada por NSFetchedResultsController y los datos se importan de forma asíncrona desde un servicio web utilizando una subclase de NSOperation que tiene su propio MOC. No estaba seguro de si ambos MOC en esa situación deberían usar NSConfinementConcurrencyType (el valor predeterminado, creo) o si el MOC asociado con el controlador de resultados obtenidos en el hilo principal debería usar NSMainQueueConcurrencyType y el MOC de fondo debería usar NSConfinementConcurrencyType .


Primero una receta en Core Data nuevos tipos de contexto.

NSMainQueueConcurrencyType crea un contexto que está asociado a la cola principal de envío y, por lo tanto, al hilo principal. Puede utilizar dicho contexto para vincularlo a los objetos que se requieren para ejecutar en el hilo principal, por ejemplo, elementos de la interfaz de usuario.

NSPrivateQueueConcurrencyType crea y administra una cola de despacho privada para operar. Debe usar los nuevos métodos performBlock: o performBlockAndWait: El contexto ejecutará los bloques pasados ​​en su propia cola privada.

Finalmente, NSConfinementConcurrencyType es el tipo predeterminado y solo se puede usar dentro del hilo donde se ha creado. Entonces, dentro de su NSOperation , lo ha usado de la manera correcta. Una simple nota. Si desea usarlo como un contexto secundario, debe tener un "contexto de cola" ( NSMainQueueConcurrencyType o NSPrivateQueueConcurrencyType ).

Ahora, sobre tu pregunta.

¿Inicializar un NSManagedObjectContext utilizando NSMainQueueConcurrencyType solo para la situación en la que ese MOC tiene un MOC secundario que se inicializó utilizando NSPrivateQueueConcurrencyType?

No, no es necesario Sí, podría configurar un contexto privado que trabaje en segundo plano y luego empuje los objetos recuperados al principal, pero haré lo contrario: use un NSPrivateQueueConcurrencyType como contexto maestro y NSMainQueueConcurrencyType como contexto secundario para el anterior . De esta manera, el contexto principal tratará solo con los objetos que están en la memoria. Guardar en el disco los realiza la cola privada solamente.

Este enfoque es utilizado por la clase UIManagedDocument . Guardar en el disco se realiza en una cadena de fondo (una cola privada). De esta manera, la IU no se congela.


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

Para mantener la IU receptiva, la mayor parte de la lógica de negocios se realiza mejor en los hilos de fondo y en contextos de "fondo". Pero la UI misma necesitará usar un contexto en algún punto, es decir, NSMainQueueConcurrencyType .

Los contextos NSMainQueueConcurrencyType con NSMainQueueConcurrencyType son adecuados para editar paneles donde los cambios se pueden guardar a la vez, es decir, se comprometen con el contexto principal. El padre no necesita usar NSMainQueueConcurrencyType .

NSConfinementConcurrencyType es el tipo predeterminado. Vincula el contexto con el hilo actual, muy a menudo el hilo principal por cierto. No debe confiar en el tipo predeterminado sino en las aplicaciones más simples. NSMainQueueConcurrencyType y NSPrivateQueueConcurrencyType son los mejores ya que usted sabe con exactitud qué cola está en uso para cada contexto.