NSNotificationCenter vs delegation (uso de protocolos?


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

Author: EEE, 2009-12-18

6 answers

La regla general aquí es cuántos clientes les gustaría ser notificados de un evento. Si se trata principalmente de un objeto (por ejemplo, para descartar una vista o para actuar sobre un botón pulsado, o para reaccionar a una descarga fallida), entonces debe utilizar el modelo de delegado.

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

 97
Author: notnoop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-18 12:41:01

Sus propósitos son diferentes:

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

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

 34
Author: mouviciel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-18 12:39:47

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

 12
Author: Shawn Craver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-18 13:40:23

Considerar el rendimiento es una buena idea (delegación mejor para un pequeño número de objetos notificados, centro de notificación mejor para un mayor número de objetos, o es? ejecutar un generador de perfiles) pero creo que un factor más importante, ya que está hablando de Objective-C y es menos probable que esté hablando de las partes realmente de alto rendimiento de su base de código, que es probable que estén escritas en C, es reducir las dependencias de tiempo de compilación entre módulos.

No hay nada que te impida tener un array of delegates rather than a single delegate.

Podría usar NSNotificationCenter solo para el estado de cualquier componente de pila de red que haga y cualquier interfaz de monitoreo de estado de dispositivo personalizada. Pero para la mayoría de los acoplamientos, que no tienen que ver con el estado global de la aplicación, creo que es más claro usar 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 vienen después de usted que usar NSNotificationCenter. De hecho, nunca he utilizado NotificationCenter para mi propio eventos personalizados y prefieren usar delegados para facilitar la comprensión del código por otra persona que lea mi código.

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

 7
Author: martinr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-18 12:59:56

Las notificaciones son mejores para desacoplar componentes de interfaz de usuario. Le permite conectar cualquier vista sin ninguna modificación en sus controladores o modelos. Definitivamente mejor para el diseño de acoplamiento flexible.

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

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

 6
Author: COzkurt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-17 02:58:05

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

 3
Author: Alejandro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-12 04:16:12