Me pregunto si hay una razón para usar una sobre otra en las observaciones de KVO contra NSNotificationCenter. Rendimiento, uso de memoria, velocidad, etc.observación de KVO frente a la observación de NSNotificationCenter
Respuesta
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.
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.
- 1. Observación Cambios en una matriz mutable usando KVO contra NSNotificationCenter
- 2. Número de observación por grupo
- 3. Cuenta de observación en NSMutableArray
- 4. Establecer el punto de observación del hardware GDB/cómo configurar el punto de observación del software
- 5. Observación del valor clave en el estado de UIButton
- 6. CDI - Observación de eventos de contenedor
- 7. Observación de cambios en la ventana de UIView y en las propiedades de la supervista
- 8. ¿Xcode tiene una ventana de observación?
- 9. Observación de claves dependientes en una relación múltiple
- 10. Observación del patrón Paul Irish 'pato perforación'
- 11. Modelo oculto de Markov que predice la siguiente observación
- 12. Observación de excepciones de tareas dentro de un ContinuarCon
- 13. No se puede obtener puntos de observación de Eclipse
- 14. Observación de cambios de propiedades animadas en un CALayer
- 15. Incorporación de pesos de observación en el paquete randomForest
- 16. Punto de observación del hardware GDB muy lento - ¿por qué?
- 17. ¿Cómo extraigo los efectos fijos de lmer por observación?
- 18. Última observación realizada en un marco de datos?
- 19. Percentil para cada observación w/r/t Agrupación de variables
- 20. Observación de una matriz C++ en Visual Studio
- 21. adición de parámetros al método reemplazado Observación E_STRICT
- 22. Añadir punto de observación no funciona en Visual Studio 2010
- 23. Objective-C Conteo Automático de Referencia (ARC) y Observación de valores-clave
- 24. Observación de un cambio en CUALQUIER propiedad de clase en Objective-C
- 25. Observación del comportamiento cuadrático con quicksort - O (n^2)
- 26. Observación divertida sobre tipos estructurales (recursivos) en Scala
- 27. ¿Obtiene la observación de valor clave en la propiedad de texto de UITextView?
- 28. Cualquier forma de mostrar/comparar referencias de objetos en la ventana de observación?
- 29. depuración o la observación de variables estáticas dentro de Flash Builder 4
- 30. MySQL de uno a muchos se unen con Group By solo devuelve una observación
Ah. No sabía sobre la agregación de notificaciones. Eso es algo bastante importante para mí. – David
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. –