5

Me encontré con este fragmento de código, y no puedo entender por qué el autor hizo esto. Eche un vistazo a este código:¿Es necesario dispatch_async (dispatch_get_main_queue(), ...) en este caso?

someMethodStandardMethodUsingABlock:^() { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil]; 
    }); 
}]; 

Tengo un método con un bloque de finalización y en este bloque se debe enviar una notificación. No entiendo por qué el dispatch_async en la cola principal es necesario en este caso. El bloque ya se ejecutará en el hilo principal, y aunque no fuera así, no creo que realmente importara, ¿verdad? Simplemente habría escrito esto:

someMethodStandardMethodUsingABlock:^() { 
    [[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil]; 
}]; 

Y funciona en mis pruebas.

Si me puede ayudar a arrojar algo de luz sobre esto, ¡realmente lo agradecería!

Matt

Respuesta

9

Estos 2 frases de la clase de referencia NSNotificationCenter sugieren un par de razones posibles:

Un centro de notificaciones proporciona notificaciones a los observadores sincrónica. En otras palabras, los métodos postNotification: no devuelven hasta que todos los observadores hayan recibido y procesado la notificación .

...

En una aplicación multiproceso, las notificaciones son siempre entregados en el hilo en el que se publicó la notificación, que puede no ser el mismo hilo en la que un observador en sí registrado.

Entonces tal vez (a) el autor no quiere que el código se bloquee hasta que todos los observadores hayan procesado la notificación, y/o (b) quiere asegurarse de que los métodos del observador se ejecuten en el hilo principal.

+0

Gracias David, b parece encajar en mi caso. Parece que los documentos no especifican, pero ¿importa si la notificación se envía en un hilo diferente al registrado por el observador? Con esto quiero decir que el observador aún se encuentra en – MGA

+0

Sí, el observador aún recibirá la notificación, incluso si se envía en un hilo diferente. –

0

En ocasiones resulta necesario ejecutar los métodos que se activan algunas ejecuciones de forma asíncrona y volver de inmediato. P.ej. algunos de los métodos de AppDelegate 'clave' como applicationDidBecomeActive, o applicationDidEnterBackground, se deben ejecutar y devolver rápidamente para que el sistema operativo no mate su aplicación.

No sé si ese es el caso de su pregunta, pero es una posible explicación del uso de dispatch_async.

Cuestiones relacionadas