NSManagedObjectContext's performBlockAndWait: no se ejecuta en la queue del receptor

He notado que es posible que un NSManagedObjectContext con un NSMainQueueConcurrencyType performBlockAndWait : y ejecute el bloque en una queue que no sea la queue (principal) del receptor.

Por ejemplo, el siguiente código da como resultado mi parentContext ejecutando el bloque en la queue de parentContext si my parentContext es de tipo NSMainQueueConcurrencyType y my childContext es de tipo NSPrivateQueueConcurrencyType :

 [childContext performBlockAndWait:^{ //Thread 1, Queue: NSManagedObjectContext Queue [parentContext performBlockAndWait:^{ //Thread 1, Queue: NSManagedObjectContext Queue //This is the same queue as the child context's queue }]; }]; 

En contraste, el siguiente código funciona como se esperaba: my parentContext ejecuta el bloque en la queue principal:

 [childContext performBlock:^{ [parentContext performBlockAndWait:^{ //Thread 1, Queue: com.apple.main-thread }]; }]; 

¿Es este el comportamiento esperado? Ciertamente, me está confundiendo, ya que el estado de los documentos "performBlockAndWait: synchronously performs a given block on the receiver's queue."

No debe preocuparse de qué bloques de hilos se ejecutan. Qué performBlock: y performBlockAndWait: methods de garantía son security de subprocesss . Por lo tanto, llamar a performBlockAndWait: del hilo principal no significa que haya un cambio de context a un hilo de background: es muy caro y no es necesario. Si durante el funcionamiento del bloque (en el hilo principal), se realiza un bash para realizar un bloque, se bloqueará hasta que se finalice el bloque que se está ejecutando actualmente. Al final del día, el resultado sería el mismo que si se hubiera realizado un cambio de context, solo más rápido. Por otro lado, llamando a performBlock: pondrá en queue el bloque en una queue arbitraria, a menudo ejecutándose en un hilo de background.

En el ejemplo anterior, ya que performBlockAndWait: su context de queue privada ejecuta su bloque en el hilo principal, al igual que el bloque de context principal. En su segundo ejemplo, progtwig el bloque para que se ejecute de forma asíncrona, por lo que se ejecuta en un subprocess de background.

No debes juzgar la fila de un hilo por su nombre. Para ver si está en la queue principal, puede usar dispatch_get_current_queue() y probar si es igual a dispatch_get_main_queue() .