¿Cuál es la diferencia entre KVO y NSNotification Center?

La observación de valores clave es el proceso por el cual un objeto está alerta a los cambios en la propiedad de otro objeto.

Las NSNotifications son eventos transmitidos al NSNotificationCenter , que entrega estos eventos a cualquier objeto que escuche esa notificación específica.

La diferencia es la especificidad. KVO generalmente se usa para rastrear cambios específicos en un objeto (es decir, una propiedad `text`) mientras que las NSNotifications se usan para rastrear” eventos “genéricos (como un usuario que finaliza el flujo de registro). KVO le dará automáticamente información útil, como el valor anterior de una propiedad y el tipo de cambio que ocurrió; NSNotifications solo emite los metadatos adicionales que especifique explícitamente.

Podría escribir un sistema KVO-esque utilizando NSNotifications, donde cada vez que haga algo como `[object setText: @” new value “]`, se emite una NSNotification específica. Pero el punto de KVO es que no requiere el código de pegamento que tiene que escribir para dicho sistema.

Internamente, KVO no usa NSNotificationCenter y en su lugar hace algunos trucos de tiempo de ejecución para evitar dicho código de pegamento; si está interesado, eche un vistazo a la excelente inmersión de Mike Ash en KVO: http://www.mikeash.com/pyblog/fr…

tl; dr Si tiene muchos objetos observando un evento poco definido, como un usuario que se registra o crea una nueva publicación, use NSNotificationCenter. Si solo tiene uno o unos pocos objetos que necesitan actuar sobre el cambio en la propiedad específica de otro objeto, entonces use KVO.

Shubhangi Kakade: Gracias por la A2A

Conceptualmente, la Observación del valor clave (KVO) es un patrón en el que un objeto puede observar el valor de las propiedades de otro objeto para conocer los cambios. Mientras, el Centro de notificaciones es un objeto único que permite que los objetos sean notificados de los eventos que ocurren.

La principal diferencia es que KVO solo se puede usar para observar la propiedad de un objeto. Mientras, NSNotification podría usarse de una manera más amplia para observar los cambios para objetos arbitrarios.

Creo que la pregunta correcta debería ser “¿Cuál es la diferencia entre Delegación, NSNotification, Blocks callback y KVO?”

Tomemos un ejemplo para entender esto con más profundidad:

Suponga que desea recibir una notificación cuando un archivo se haya terminado de descargar. Teniendo en cuenta los siguientes patrones:

  1. KVO : esto no se puede lograr con KVO ya que la descarga de archivos es un evento arbitrario. KVO debe usarse para eventos como el que desea recibir una notificación cuando se haya cambiado el estado o el texto o alguna otra propiedad de un botón.
  2. Delegado : podemos usar delegado para esto, pero tendremos que escribir una gran cantidad de código, incluidos los métodos de protocolo de escritura, la verificación de la conformidad del protocolo, la verificación de respuestas aSelector, etc.
  3. NSNotification : también podemos lograr esto con NSNotification y tenemos que escribir menos código que Delegate. Pero esto es nuevamente doloroso.
  4. Blocks : también podemos hacer esto con Blocks, y personalmente creo que es la mejor manera de hacerlo. Los bloques son particularmente útiles como devolución de llamada porque el bloque transporta tanto el código que se ejecutará en la devolución de llamada como los datos necesarios durante la ejecución.

En mi vista,

KVO debe usarse para observar cambios en la propiedad de un objeto.

Los delegados deben usarse cuando hay muchas devoluciones de llamada y solo se desea que se notifique un objeto. Los delegados son objetos que actúan como otro programa cuando se dispara un evento.

NSNotifcation debe usarse cuando hay varios objetos que deben notificarse

Los bloques deben usarse cuando desee que el control esté dentro del mismo método y sean útiles cuando se trata de pequeñas devoluciones de llamada.

PD: Prefiero usar Bloques más que delegados / NSNotification pero nuevamente todo depende del escenario.

More Interesting

Objective-C (lenguaje de programación): ¿Cómo explica la estructura de argumento impar de NSStringWithFormat, en la que se proporcionan más argumentos después de una coma?

¿Cuánto cuesta producir contenido de juegos de realidad virtual y cómo se compara con las formas existentes de contenido de juegos de PC / consola?

¿Cómo le enseñarías a un no programador a hacer una aplicación de "instagram para video"?

¿Se puede crear una aplicación para iPhone sin un iPhone o iPad?

¿Por qué Apple introduciría nuevos lenguajes de programación (por ejemplo, Swift) en lugar de adoptar uno existente?

¿Cuál fue su experiencia al integrar Swift en un proyecto Objective-C?

¿Cómo puedo agregar video chat y capacidad de conferencia a mi aplicación iOS? ¿Hay SDK que me permitan hacer eso y también grabar la transmisión?

¿Bluetooth de baja energía finalmente obtendrá equipos de automatización del hogar de diferentes fabricantes que se interconectarán o es solo otro protocolo para agregar a la pila?

¿Cuáles son los pros y los contras de construir con Adobe Flex, en comparación con el desarrollo nativo de iOS o Android?

¿Es necesaria una Mac para el desarrollo de iOS?

¿Cómo debería una aplicación iOS descargar dinámicamente recursos gráficos y de audio?

¿Cómo es comenzar a aprender el desarrollo de Swift a través del desarrollo de Apple Watch en lugar de iOS o macOS?

¿Qué es swift? ¿Es un lenguaje completamente nuevo para reemplazar Objective-C, o es solo un complemento de Objective-C?

¿Puede una persona usar el nuevo lenguaje de programación Swift de Apple para desarrollar un nuevo sistema operativo, lejos del sistema operativo de Apple? ¿O solo puedes hacer aplicaciones?

Si se requieren $ 300k para desarrollar una aplicación iOS, ¿cuánto, aproximadamente, costaría codificar una versión de Android?