¿Cómo funciona dispatch_set_target_queue?

Debido a la falta de material en dispatch_set_target_queue , he venido aquí para pedir ayuda, ¡gracias!

Aquí está mi código de testing:

 dispatch_queue_t mySerialDispatchQueue1 = dispatch_queue_create("come.itenyh", NULL); dispatch_queue_t mySerialDispatchQueue2 = dispatch_queue_create("come.itenyh1", NULL); dispatch_set_target_queue(mySerialDispatchQueue1, mySerialDispatchQueue2); dispatch_async(mySerialDispatchQueue1, ^{[self task:@"s1"];}); dispatch_async(mySerialDispatchQueue2, ^{[self task:@"p1"];}); dispatch_async(mySerialDispatchQueue1, ^{[self task:@"s2"];}); - (void)task:(NSString *)taskid { NSLog(@"Now executing taskid:%@", taskid); [NSThread sleepForTimeInterval:5]; } 

Ahora si lo pongo

  dispatch_set_target_queue(mySerialDispatchQueue2, mySerialDispatchQueue1); 

entonces el resultado es:

 2014-04-16 22:23:49.581 ITGCDLearning[66758:1303] Now executing taskid:s1 2014-04-16 22:23:54.585 ITGCDLearning[66758:1303] Now executing taskid:s2 2014-04-16 22:23:59.586 ITGCDLearning[66758:1303] Now executing taskid:p1 

y por el contrario, si pongo

 dispatch_set_target_queue(mySerialDispatchQueue1, mySerialDispatchQueue2); 

entonces el resultado es:

 2014-04-16 22:28:37.910 ITGCDLearning[66795:1303] Now executing taskid:s1 2014-04-16 22:28:42.913 ITGCDLearning[66795:1303] Now executing taskid:p1 2014-04-16 22:28:47.915 ITGCDLearning[66795:1303] Now executing taskid:s2 

Sé que la function dispatch_set_target_queue puede

  • cambiar el priorty de la queue
  • cree una jerarquía de queues de envío.

Creo que es el segundo punto que lleva al resultado en mi código, pero no conozco realmente los detalles específicos. ¿Alguien puede explicar me lo?

De acuerdo conmigo cuando configura una queue de destino a otra, está sincronizando la tarea de la queue, así que en el primer caso: dispatch_set_target_queue (mySerialDispatchQueue2, mySerialDispatchQueue1); mySerialDispatchQueue1 es la queue de destino por lo que toda la tarea agregada en mySerialDispatchQueue2 también está enqueueda desde mySerialDispatchQueue1. Como es la queue de destino. Por lo tanto, mySerialDispatchQueue1 ya tiene dos tareas para que otra de la queue mySerialDispatchQueue2 se agregue más tarde.

En el segundo caso: dispatch_set_target_queue (mySerialDispatchQueue1, mySerialDispatchQueue2); su queue de destino es mySerialDispatchQueue2, así que en el inicio cuando no hay tarea, entonces la tarea de mySerialDispatchQueue1 se agrega en mySerialDispatchQueue2 y luego su propia tarea está en queue. Entonces, de esta manera, se agregó la tarea.