iphone objective-c delegates protocols nsnotifications

iphone - NSNotificationCenter vs delegación(usando protocolos)?



objective-c delegates (6)

¿Cuáles son los pros y los contras de cada uno de ellos?
¿Dónde debería usarlos específicamente?


La regla de oro es cuántos clientes desean recibir notificaciones de un evento. Si se trata principalmente de un objeto (por ejemplo, para descartar una vista o actuar sobre un botón presionado, o para reaccionar ante una descarga fallida), entonces debe usar el modelo de delegado.

Si el evento que usted emite puede ser de interés para muchos objetos a la vez (por ejemplo, pantalla girada, uso de memoria, inicio de sesión / cierre de sesión de usuario), entonces debe usar NSNotificationCenter .


Las notificaciones son generalmente mejores para notificar a la interfaz de usuario de los cambios que ocurren en otros hilos también. La documentación de Apple desaconseja firmemente el uso de delegados en los subprocesos siempre que sea posible, tanto por motivos de estabilidad como de rendimiento. En la Mac, sugieren el uso de enlaces, pero dado que no existen en el iPhone, las notificaciones son probablemente su próxima mejor apuesta.


Las notificaciones son mejores para desacoplar los componentes de la interfaz de usuario. Le permite conectar cualquier vista sin ninguna modificación en sus controladores o modelos. Definitivamente mejor para un diseño débilmente acoplado.

Pero para el rendimiento entre la delegación y la notificación, debe pensar en la frecuencia de la llamada.

La delegación puede ser mejor para eventos más frecuentes, las notificaciones son mejores para eventos menos frecuentes pero más destinatarios. Depende de proyectar qué elegir.


Sus propósitos son diferentes:

  • La notificación se usa para transmitir mensajes a posiblemente varios destinatarios desconocidos por el remitente.

  • La delegación se usa para enviar mensajes a un único destinatario conocido que actúa en nombre del remitente.


Tener en cuenta el rendimiento es una buena idea (delegación mejor para una cantidad pequeña de objetos notificados, centro de notificación mejor para una mayor cantidad de objetos, o ¿es? Ejecutar un generador de perfiles) pero creo que es un factor más importante ya que está hablando de Objective-C y Es menos probable que se hable sobre las partes de alto rendimiento de su base de código, que probablemente se escriban en C, lo que reduce las dependencias en tiempo de compilación entre los módulos.

No hay nada que lo impida tener una variedad de delegados en lugar de un solo delegado.

Podría usar NSNotificationCenter solo para el estado de cualquier componente de la pila de red que haga y cualquier interfaz de monitoreo de estado del dispositivo personalizado. Pero para la mayoría de los acoplamientos, no tiene que ver con el estado global de la aplicación, creo que es más claro utilizar contratos de interfaz normales en Objective-C en la mayoría de los casos y más fácil de seguir para las personas que lo siguen que utilizar NSNotificationCenter. De hecho, nunca he usado NotificationCenter para mis propios eventos personalizados y prefiero usar delegados para facilitar la comprensión del código por otra persona que lee mi código.

Y, por último, por supuesto, con las notificaciones a / desde la API estándar no tiene elección y debe usar cualquiera de los dos métodos que Apple prohíbe para un evento determinado.


Una opción entre esos dos es usar el patrón de observador, sin NSNotificationCenter . Mira mi implementación de Objective-C here .