2009-12-18 9 views

Respuesta

94

La regla de oro aquí es cuántos clientes desean recibir notificaciones de un evento. Si se trata principalmente de un objeto (por ejemplo, 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 y cierre de sesión de usuario), entonces debe usar NSNotificationCenter.

+25

También agregaría que las notificaciones son unidireccionales (por ejemplo, 'DidFireMissle'), mientras que se necesita un delegado si necesita devolver información (por ejemplo,' - (BOOL) shouldFireMissle'). – benzado

+7

@benzado: en realidad, puede pasar un objeto junto con un mensaje, que los receptores pueden cambiar. Debe tener en cuenta que múltiples (o cero) receptores podrían manejar la notificación, pero es válida. –

34

Sus propósitos son diferentes:

  • notificación se utiliza para transmitir mensajes a varios destinatarios desconocidos, posiblemente, desde el emisor.

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

7

Teniendo en cuenta el rendimiento es una buena idea (delegación mejor para una pequeña cantidad de objetos notificados, centro de notificación mejor para una mayor cantidad de objetos, o es? Ejecute un generador de perfiles) pero creo que un factor más importante ya que está hablando Objective-C y es menos probable que esté hablando de las partes de alto rendimiento de su base de código, que probablemente estén escritas en C, están reduciendo las dependencias de tiempo de compilación entre 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 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.

11

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.

3

Una opción entre esas dos está utilizando el patrón de observador, sin NSNotificationCenter. Mira mi implementación de Objective-C here.

6

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 delegación y 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.

Cuestiones relacionadas