2011-10-23 8 views
30

Aunque tengo alguna idea de qué usar cuando el uso exacto aún no está claro para mí. ¿Alguien puede explicar con el ejemplo ...? Gracias.KVO vs NSNotification vs protocolo/delegados?

+3

Intenta leer esto, es un artículo de blog realmente interesante sobre el tema para un punto de vista de programador. http://blog.shinetech.com/2011/06/14/delegation-notification-and-observation/ – Daniel

Respuesta

36

Use un delegado si desea hablar con un solo objeto. Por ejemplo, un tableView tiene un delegado: solo un objeto debe ser responsable de manejarlo.

Use las notificaciones si desea informar a todos que algo ha sucedido. Por ejemplo, en situaciones de poca memoria, se envía una notificación que le informa a su aplicación que ha habido una advertencia de memoria. Debido a que muchos objetos en su aplicación pueden querer reducir el uso de su memoria, es una notificación.

No creo que KVO sea una buena idea y trate de no usarlo, pero si desea saber si una propiedad ha cambiado, puede escuchar los cambios.

Espero que ayude.

PS This sums up why I think KVO is broken

+4

Sé que esto es viejo, pero todavía quiero estar en desacuerdo :) Ese artículo destaca excelentes puntos. por qué la API de KVO está rota, pero también afirma con precisión que sigue siendo una herramienta poderosa. Hay muchas situaciones en las que puede guardar un montón de código feo. Úselo con un envoltorio como el que proporcionó si lo desea, pero sí úselo. – Shinigami

+0

Utilice KVO cuando los observadores necesiten una respuesta inmediata. Y uno puede usar NSNotifications cuando los observadores pueden esperar el ciclo de eventos. – MANN

+0

@MANN Creo que no entiendo: las notificaciones no son asincrónicas, también se activan de inmediato (aunque no se obtienen las opciones de cambio de dirección que se obtienen con KVO) – deanWombourne

12

Usar un delegado cuando existe una relación "maestro/esclavo" (delegado sabe acerca de la clase y la clase sabe sobre el delegado), con una clase más arriba en la jerarquía de control, y cuando está Está claro que no habrá situaciones en las que otros elementos (principalmente UI) estén interesados ​​en saber lo que la clase tiene que decir. Use notificaciones cuando la clase no esté interesada en saber quién escucha y cuántos son, cualquiera y cualquier número puede registrarse para las notificaciones. KVO es útil para escuchar "sin que la clase lo sepa", aunque, por supuesto, ese no es el caso, no es necesario cambiar la clase en la que se aplica KVO.

2

La delegación es un patrón de diseño que utiliza cuando quiere que algún otro objeto modifique el comportamiento del remitente. Ejemplo: las ventanas de terminal evitan mostrar líneas o caracteres recortados por los bordes de la ventana, ya que el delegado de la ventana del terminal altera el tamaño de la ventana para garantizar esto.

La notificación es un patrón para usar cuando no necesita una respuesta. Ejemplo: recibe una notificación de que el sistema está a punto de quedarse dormido. Al remitente de esa notificación no le importa lo que hagas al respecto.

1

En mi opinión, KVO es mejor debido a sus ventajas de cero gastos generales. Las notificaciones tienen una sobrecarga incluso si no las está usando/observándolas. Para mejorarlo, puede usar NotificationCenters diferentes, pero incluso con eso habrá algunos gastos generales (corríjanme si me equivoco). KVO es un poco complejo pero vale la pena cuando tienes que observar muchas cosas.

+0

¿Cuánto, en términos prácticos, es la sobrecarga? – Liron

2

Incluso cuando los tres serviría su necesidad en una situación, delegado seguiría siendo una opción prefieren:

  1. Reuseability.
  2. Auto documentado. Al examinar el archivo de encabezado de la clase, uno reconocería inmediatamente qué/cómo se estaban produciendo los datos intercambiados.
Cuestiones relacionadas