La idea básica es que en todos los casos el método de observador o el delegado se denominan en el mismo hilo de la notificación inicial (por el patrón del observador) o el código de delegación se están ejecutando, por lo que si no está seguro de que se recomienda enviar su bloque de IU en el hilo principal. Trataré de justificar estas declaraciones en el siguiente razonamiento, por supuesto que puedo estar equivocado.
A menos que se especifique explícitamente en la documentación del protocolo delegado, en el patrón delegado se llama directamente a un método en el mismo hilo que la persona que llama se está ejecutando en el momento de la llamada. P.ej. Si la persona que llama (objeto delegar) quiere llamar a su delegado y actualmente se está ejecutando en "Tema-1", entonces la llamada va a ocurrir en el mismo hilo:
// this is running in "Thread-1" --> then aDelegateMethod will continue on "Thread-1"
[myDelegate aDelegateMethod]
En cuanto al patrón de observador, no lo vea cualquier razón válida para que el sistema envíe una notificación de observación explícitamente en el hilo principal, especialmente si el cambio de valor original que origina la notificación se está ejecutando en otro hilo. De hecho, en el caso de KVO, el tiempo de ejecución cambia la definición de clase al agregar algunos métodos privados que anulan los métodos de establecimiento para hacer las notificaciones, y no veo una razón válida para hacer esta llamada explícitamente en el hilo principal. Entonces, según yo, una notificación de KVO puede originarse desde cualquier hilo y este hilo es el mismo que está ejecutando el cambio de valor en la clase observada.
Finalmente, el mecanismo basado en NSNotificationCenter ve sus notificaciones llamadas por el mismo hilo donde se ha publicado la notificación original. Esto está claramente establecido en la documentación de Apple (y vale la pena decir que cada hilo tiene su propia cola de notificaciones).
Por lo tanto, en todos los casos, el hilo se mantiene y si quiere asegurarse de que su bloque UI se llame en la cola principal, utilice la llamada GCD que publicó en su pregunta.
También para NSURLConnection las devoluciones de llamadas de delegados están en la secuencia que inició la operación de carga asíncrona, que no tiene por qué ser el hilo principal. – progrmr
Seguramente estaría bien si los documentos dejaran esto en claro, pero por ejemplo, UIImagePickerControllerDelegate Protocol Reference ni siquiera usa la palabra 'thread'. No he visto ningún problema con imagePickerController: didFinishPickingMediaWithInfo :, pero de repente me he vuelto más consciente de los problemas de subprocesos. Tu recorte fue definitivamente útil para las notificaciones, que uso en mi aplicación. Una vez más, mi nuevo conocimiento de hilos me hizo pensar en ellos. Tendré que revisarlos todos para asegurarme de que todos sean correctos. ¡Gracias! – John
Puede suponer que con los objetos de la interfaz de usuario los delegados siempre están en el hilo principal. Los documentos especificarán si hay una excepción, que nunca he visto. Puede inferir esto de los documentos aquí. http://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW147 – logancautrell