¿Qué quiere decir Apple cuando dicen que un NSManagedObjectContext es propiedad del hilo o la cola que lo creó?
Parece que en noviembre, Apple actualizó tanto elReferencia de clase NSManagedObjectContext y elGuía de programación de datos básicos documentos para bendecir explícitamente las colas de despacho GCD en serie y NSOperationQueues como mecanismos aceptables para sincronizar el acceso a unNSManagedObjectContext
. Pero su consejo parece ambiguo y posiblemente contradictorio, y quiero asegurarme de haberlo entendido correctamente.
Anteriormente, la sabiduría aceptada parecía ser que unNSManagedObjectContext
solo se podía acceder desde el hilo que lo creó, y que usar una cola en serie para la sincronización no era suficiente; aunque las colas en serie solo realizan una operación a la vez, estas operaciones pueden programarse potencialmente en diferentes subprocesos, y a un MOC no le gusta eso.
Pero ahora, de la guía de programación, tenemos:
Puede usar subprocesos, colas de operación en serie o colas de despacho para concurrencia. En aras de la concisión, este artículo utiliza "hilo" para referirse a cualquiera de estos.
Hasta ahora, todo bien (aunque su combinación de hilos y colas no es útil). Por lo tanto, puedo usar de forma segura un solo contexto por cola (en serie), en lugar de uno por operación / bloque, ¿verdad? Apple incluso tiene una representación visual de esto en las sesiones de Core Data WWDC.
Pero ... ¿dónde creas el contexto para la cola? En elNSManagedObjectContext
documentación, estado de Apple:
[Un contexto] asume que el propietario predeterminado es el hilo o la cola que lo asignó; esto lo determina el hilo que llama a su método init. Por lo tanto, no debe inicializar un contexto en un hilo y luego pasarlo a un hilo diferente.
Así que ahora tenemos la idea de unNSManagedObjectContext
necesita saber quién es su dueño. Supongo que esto significa que la primera operación que se ejecutará en la cola debe crear el MOC y guardar una referencia para que las operaciones restantes lo utilicen.
¿Es esto correcto? La única razón por la que dudo es que elNSManagedObjectContext
el artículo continúa diciendo:
En su lugar, debe pasar una referencia a un coordinador de tienda persistente y hacer que el hilo / cola de recepción cree un nuevo contexto derivado de eso. Si usa NSOperation, debe crear el contexto en main (para una cola en serie) o start (para una cola concurrente).
Apple ahora parece estar combinando operaciones con las colas que programan su ejecución. Esto me hace pensar y me hace preguntarme si realmente quieren que crees un nuevo MOC para cada operación después de todo. ¿Qué me estoy perdiendo?