KVO vs NSNotification vs protocolo / delegados?


Aunque tengo alguna idea de qué usar cuando, pero el uso exacto todavía no está claro para mí. Puede alguien explicar con ejemplo...? Gracias.

Author: Ankit Srivastava, 2011-10-23

5 answers

Utilice un delegado si desea hablar con un solo objeto. Por ejemplo, una vista de tabla tiene un delegado-solo un objeto debe ser responsable de tratar con él.

Use notificaciones si desea decirle a todos que algo ha sucedido. Por ejemplo, en situaciones de poca memoria, se envía una notificación que indica a tu app que ha habido una advertencia de memoria. Debido a que muchos objetos en tu aplicación podrían querer reducir su uso de memoria, es una notificación.

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

Espero que eso ayude.

PS Esto resume por qué creo que KVO está roto

 37
Author: deanWombourne,
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
2011-10-23 08:59:21

Use un delegado cuando hay una relación "maestro/esclavo" (el delegado sabe acerca de la clase y la clase sabe acerca del delegado), con una clase más arriba en la jerarquía de control, y cuando está claro que no habrá situaciones donde otros elementos (principalmente UI) estarán interesados en saber lo que la clase tiene que decir. Utilice 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 escuche "sin que la clase lo sepa", aunque por supuesto ese no es el caso, la clase en la que se aplica KVO no necesita ser cambiada.

 13
Author: jbat100,
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
2011-10-23 09:00:31

La delegación es un patrón de diseño que se utiliza cuando se desea que 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, porque el delegado de la ventana de 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 entrar en reposo. El remitente de esa notificación no me importa lo que hagas al respecto.

 2
Author: NSResponder,
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
2011-10-23 09:15:54

Incluso cuando los tres servirían a su necesidad en una situación, delegate seguiría siendo una opción preferida:

  1. Reuseability.
  2. Auto documentada. Al examinar el archivo de encabezado de la clase, uno reconocería inmediatamente qué / cómo se producen los datos intercambiados.
 2
Author: user523234,
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
2013-03-16 13:45:41

En mi opinión, KVO es mejor debido a sus ventajas de cero gastos generales. Las notificaciones tienen sobrecarga incluso si no las está usando / observando. Para mejorar que se puede utilizar diferentes NotificationCenters pero incluso con que algunos gastos generales estarán allí (corrígeme si me equivoco). KVO es poco complejo, pero vale la pena cuando tienes que observar un montón de cosas.

 1
Author: MANN,
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-10-12 15:12:23