Respuesta

15

Los dos no son siempre intercambiables. Conceptualmente, KVO es solo para observar una propiedad de un objeto. Por ejemplo, no puede usar KVO para reemplazar NSApplicationWillTerminateNotification porque notifica a los observadores sobre un evento que ocurre, no un cambio en la propiedad de un objeto.

En cuanto al rendimiento y el uso de memoria, ambos son rápidos y usan memoria despreciable. NSNotificationQueue se ha unido para detener inundaciones de notificaciones. Por lo que sé, KVO no tiene ningún tipo de fusión, lo que sí me causó problemas de rendimiento en un punto. Estaba observando cientos de objetos, y cuando ocurriera una actualización por lotes a esos objetos obtendría cientos de devoluciones de llamadas de KVO. No fue un problema de rendimiento con KVO en sí, sino con mi propio código ejecutándose como resultado de la actualización del lote.

El rendimiento no es realmente el problema, es más acerca de la mejor opción para el problema. Si se trata de un cambio de propiedad, use KVO. Si no se trata de un cambio de propiedad, use un delegado o una notificación dependiendo de si necesita un solo observador o múltiples observadores.

+1

Ah. No sabía sobre la agregación de notificaciones. Eso es algo bastante importante para mí. – David

+2

Las notificaciones se usan mejor cuando no hay necesidad de que un objeto conozca algún otro objeto específico. Por ejemplo, es posible que desee actualizar un conjunto de vistas si algunos cambios de configuración en su aplicación y con las notificaciones esas vistas no tienen que tener ningún conocimiento del objeto que gestiona la configuración, lo que preserva MVC. –

0

Una pregunta muy antigua, pero pensé en agregar algunos puntos. Estoy de acuerdo con Tom Dalling's answer, sin embargo, hay muchos escenarios en aplicaciones grandes donde tendemos a agregar observador para una propiedad de un objeto y no podemos, o, nos perdemos de eliminarlos de la lista de observadores.

Consideremos el siguiente escenario desde mi aplicación: un ViewController muestra un objeto de serpiente, estoy observando un cambio de propiedad en este objeto - "veneno". Entonces, siempre que viewController necesite mostrar una serpiente diferente, simplemente eliminaría el controlador de vista del observador de ese objeto de serpiente.

La aplicación evolucionó para mostrar una lista de serpientes en lugar de una sola serpiente, esto significa que tuve que observar para la propiedad de todas las serpientes en ese objeto. Ahora, cuando se quite una serpiente antigua de la matriz, debería conocer este evento para poder eliminar el controlador de visualización como observador de este objeto serpiente. Para hacer esto, primero tengo que observar los cambios en la matriz en sí. Para hacer esto, tengo que seguir un protocolo particular para insertar objetos en la matriz y eliminarlos de la matriz. De esta manera, la complejidad se basa. Todos conocemos las consecuencias de no eliminar al observador de un objeto y si ese objeto es liberado por el sistema operativo.

anterior es sólo un ejemplo de citar, el problema principal aquí es no puedo obtener la lista de observadores MVA para un objeto dado para sacarlos de los observadores antes de que este objeto se libera - Esto puede lograrse fácilmente por NSNotification y NSNotificationCenter. En ocasiones, tiendo a inclinarme hacia el uso de NSNotification sobre KVO, sin embargo, KVO siempre tiene una ventaja sobre la notificación en términos de buenas prácticas de diseño.

Cuestiones relacionadas