tutorial gratis español curso aprende objective-c grand-central-dispatch

objective-c - gratis - swift 4 tutorial español



GCD para realizar tareas en hilo principal (4)

Como mencionaron las otras respuestas, dispatch_async del hilo principal está bien.

Sin embargo, dependiendo de su caso de uso, hay un efecto secundario que puede considerar una desventaja: ya que el bloqueo está programado en una cola, no se ejecutará hasta que el control regrese al ciclo de ejecución, lo que tendrá el efecto de demorar. la ejecución de su bloque.

Por ejemplo,

NSLog(@"before dispatch async"); dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"inside dispatch async block main thread from main thread"); }); NSLog(@"after dispatch async");

Se imprimirá:

before dispatch async after dispatch async inside dispatch async block main thread from main thread

Por esta razón, si esperabas que el bloque se ejecutara entre los NSLog externos, dispatch_async no te ayudaría.

Tengo una devolución de llamada que podría provenir de cualquier hilo. Cuando reciba esta devolución de llamada, me gustaría realizar una tarea determinada en el hilo principal.

¿Debo verificar si ya estoy en el hilo principal o hay alguna penalización por no realizar esta comprobación antes de llamar al código que se encuentra a continuación?

dispatch_async(dispatch_get_main_queue(), ^{ // do work here });


No, no necesita verificar si ya está en el hilo principal. Al enviar el bloque a la cola principal, solo está programando que el bloque se ejecute en serie en el hilo principal, lo que sucede cuando se ejecuta el bucle de ejecución correspondiente.

Si ya está en el hilo principal, el comportamiento es el mismo: el bloque está programado y se ejecuta cuando se ejecuta el bucle de ejecución del hilo principal.


No, no necesitas verificar si estás en el hilo principal. Aquí es cómo puedes hacer esto en Swift:

runThisInMainThread { () -> Void in runThisInMainThread { () -> Void in // No problem } } func runThisInMainThread(block: dispatch_block_t) { dispatch_async(dispatch_get_main_queue(), block) }

Se incluye como una función estándar en mi repositorio, échale un vistazo: https://github.com/goktugyil/EZSwiftExtensions


Para el caso de envío asíncrono que describió anteriormente, no debería necesitar verificar si está en el hilo principal. Como indica Bavarious, esto simplemente se pondrá en cola para ejecutarse en el hilo principal.

Sin embargo, si intenta hacer lo anterior utilizando dispatch_sync() y su devolución de llamada está en el hilo principal, su aplicación se interbloqueará en ese punto. -performSelectorOnMainThread: esto en mi respuesta here , porque este comportamiento me sorprendió al mover algún código de -performSelectorOnMainThread: Como mencioné allí, creé una función auxiliar:

void runOnMainQueueWithoutDeadlocking(void (^block)(void)) { if ([NSThread isMainThread]) { block(); } else { dispatch_sync(dispatch_get_main_queue(), block); } }

que ejecutará un bloque de forma síncrona en el subproceso principal si el método en el que se encuentra no está actualmente en el subproceso principal, y simplemente ejecuta el bloque en línea si es así. Puedes usar una sintaxis como la siguiente para usar esto:

runOnMainQueueWithoutDeadlocking(^{ //Do stuff });