¿Diferencia entre queue principal / queue actual y subprocess principal / subprocess de background en este caso?

Estoy ejecutando el siguiente método:

MotionHandler.m

-(void)startAccelerationUpdates { [motionManagerstartDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]withHandler:^(CMDeviceMotion *motion, NSError *error){.....} } 

en un hilo de background, de la siguiente manera:

 [currentMotionHandler performSelectorInBackground:@selector(startAccelerationUpdates) withObject:nil]; 

Pero el método anterior utiliza la main Queue (que está en el hilo principal) para realizar las actualizaciones necesarias aunque la invoco en un hilo de background. Entonces, las actualizaciones de aceleración se realizan en un hilo de background o en el hilo principal, Estoy confundido..?

Lo que es aún más interesante es que cuando llamo al método anterior en hilo de background nuevamente, pero esta vez usando la current Queue , no recibo actualizaciones. ¿Alguien podría explicar la diferencia entre ejecutar algo:

  1. a background thread but on the main queue 2. a background thread but on the current queue 3. the main thread but on the main queue 4. the main thread but on the current queue 

en la implementación actual? ¡Gracias!

Lo intentaré. Primero, sin que nos lo indique la reference de la class NSOperationQueue, no podríamos inferir nada sobre qué hilo se ejecutaría el 'mainQueue'. Al leerlo, vemos que, de hecho, esa queue ejecuta sus operaciones en mainThread, la que utiliza la interfaz de usuario para que pueda actualizar la interfaz de usuario en las operaciones publicadas en esa queue. Aunque no lo dice, estas operaciones deben ser seriales, debido a que son ejecutadas por runLoop (es posible que también puedan tener prioridad, no estar 100% seguro de eso).

El propósito de currentQueue es que las operaciones en ejecución puedan determinar la queue en la que están activadas, y pueden potencialmente poner en queue nuevas operaciones en esa queue.

  1. un hilo de background pero en la queue principal

No es posible: el mainQueue de NSOperation siempre está asociado con mainThread.

  1. un hilo de background pero en la queue actual

Cuando se crea un NSOperationQueue y se agregan NSOperations, se ejecutan en subprocesss de background gestionados por la queue. Cualquier operación dada puede consultar qué hilo está encendido, y ese hilo no cambiará mientras se ejecuta. Dicho esto, una segunda operación en esa queue puede ejecutarse en un hilo diferente.

  1. el hilo principal pero en la queue principal

Ver 1)

  1. el hilo principal pero en la queue actual

Si pone en queue una operación en mainQueue (que sabemos que siempre está en mainThread) y solicita el currentQueue, devolverá mainQueue:

 [NSOperationQueue currentQueue] == [NSOperationQueue mainQueue]; 

Estás confundiendo queues con hilos. Especialmente dado que NSOpertionQueue se ha reescrito para usar GCD, hay poca connection entre queues e hilos específicos (excepto el caso especial del hilo principal).

Las operaciones / bloques / tareas, lo que sea que quiera llamarlos, se insertan en una queue y los "subprocesss de trabajo" los arrancan y los ejecutan. Tienes poco control sobre qué hilo exacto hará el trabajo, excepto la queue principal. Tenga en count que esto no es exactamente correcto, porque es una simplificación, pero es bastante cierto a less que esté haciendo algo bastante avanzado y específico.

Por lo tanto, ninguno de sus 4 escenarios tiene sentido, porque no puede, por ejemplo, ejecutar algo en "un hilo de background pero en la queue principal".

Ahora, su método startAccelerationUpdates le dice específicamente a CMMotionManager que ponga su manejador en la queue principal. Por lo tanto, cuando se llama a startAccelerationUpdates , se ejecuta en cualquier subprocess que se esté ejecutando, pero progtwig el manejador que se ejecutará en el subprocess principal.

Para complicar un poco las cosas, está llamando al método performSelectorInBackground llamando a performSelectorInBackground . Una vez más, no sabes qué subprocess invocará realmente startAccelerationUpdates , pero no será el hilo principal.

Sin embargo, en su caso, todo lo que hace este subprocess es llamar a startAccelerationUpdates que está iniciando actualizaciones de movimiento y diciéndoles que se manejen en el hilo principal (a través de la queue principal).

Ahora, aquí hay algo para disuadirlo de usar la queue principal para manejar events de movimiento, directamente desde la documentation …

Debido a que los events procesados ​​pueden llegar a una velocidad alta, no se recomienda utilizar la queue de operaciones principal.

Desafortunadamente, su statement

Lo que es aún más interesante es que cuando llamo al método anterior en hilo de background nuevamente, pero esta vez usando la queue actual, no recibo actualizaciones.

no proporciona suficiente información para determinar qué intentaste, cómo lo probaste o por qué crees que no funcionó. Entonces, voy a hacer una conjetura … que puede estar mal.

Teclearé tu uso de the current Queue .

Supongo que quiere decir que sustituya [NSOperationQueue mainQueue] por [NSOperationQueue currentQueue] .

Bueno, veamos qué hace eso. En lugar de utilizar la queue principal, usará la queue "some other". ¿Cúal? Bueno, veamos la documentation:

currentQueue

Devuelve la queue de operaciones que inició la operación actual.

+ (id) currentQueue

Valor de retorno

La queue de operaciones que inició la operación o nula si la queue no pudo determinarse.

Discusión

Puede usar este método desde un object de operación en ejecución para get una reference a la queue de operaciones que lo inició. Llamar a este método desde fuera del context de una operación en ejecución normalmente da como resultado que no se devuelva nada.

Tenga en count la sección de discusión. Si llama a esto cuando no esté ejecutando una operación que se invocó desde un NSOperationQueue , obtendrá nil que significa que no habrá ninguna queue en la que ubicar su controller. Entonces, no obtendrás nada.

Debe especificar qué queue se va a utilizar, si desea utilizar un NSOperationQueue no sea la queue principal. Por lo tanto, si esa es la ruta que desea recorrer, simplemente cree su propia queue de operaciones para manejar events de movimiento y ¡apague!

¡Buena suerte!