objective-c - tutorial - nsoperationqueue swift 3 example
Realizar en Next Run Loop: ¿Qué está mal con GCD? (2)
Estoy probando estos dos enfoques:
dispatch_async(dispatch_get_main_queue(),^{
[self handleClickAsync];
});
y
[self performSelector:@selector(handleClickAsync) withObject:nil afterDelay:0];
en respuesta a un botón presiona.
El segundo permite al UIButton
resaltar como se esperaría y realizar el handleClickAsync
en el próximo ciclo de ejecución (supongo: "algún día después" seguro). El primero no permite que la instancia de UIButton
encienda hasta que la operación esté completa.
¿Cuál es la forma correcta de hacer esto con GCD, o todavía es la única forma de realizar performSelector
?
Creo que esto llegará a su punto:
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//bla bla bla
}];
Creo que la respuesta se encuentra aquí en una discusión de la cola principal de despacho :
Esta cola trabaja con el ciclo de ejecución de la aplicación (si hay uno) para intercalar la ejecución de tareas en cola con la ejecución de otras fuentes de eventos asociadas al ciclo de ejecución.
En otras palabras, la cola de despacho principal configura una cola secundaria (junto con la cola de eventos estándar proporcionada por UIApplicationMain()
para manejar los bloques enviados a la cola principal. Cuando los bloques están presentes en la cola, el ciclo de ejecución alternará las tareas de UIApplicationMain()
colas del cola de evento principal y la cola de envío. Por otro lado, la reference para el parámetro de delay
de -performSelector:withObject:afterDelay:
toma nota de que:
Especificar un retraso de 0 no necesariamente hace que el selector se realice de inmediato. El selector todavía está en cola en el ciclo de ejecución del subproceso y se realiza lo antes posible.
Por lo tanto, cuando usa el selector de rendimiento, la operación se pone en cola al final de la cola del evento principal y no se ejecutará hasta que todo lo que se encuentra delante de la cola (que incluye el código para UIButton
el UIButton
) se haya procesado. Sin embargo, cuando utiliza la cola de despacho principal, agrega el bloque a la cola secundaria, que luego es procesada inmediatamente (es decir, en el siguiente ciclo de ejecución), suponiendo que no haya otros bloques en la cola principal. En este caso, el código para deshabilitar el botón aún se encuentra en la cola del evento principal, mientras que el ciclo de ejecución procesa el evento desde la cola del bloque secundario.