Guía de KVO para Swift. Key-Value Observing

En todas nuestras Apps tenemos clases que necesitan saber cuando alguna propiedad de otra clase ha cambiado.

Key-value observing is a Cocoa programming pattern you use to notify objects about changes to properties of other objects.

Apple nos proporciona un patrón propio para solventar esta necesidad bajo el nombre de Key-Value Observing. Para poder implementarlo se deben cumplir los siguientes resquisitos

  • Las clases deben heredar de NSObject
  • La propiedad o propiedades que queremos observar deben indicarse con los modificadores @objc y dynamic
  • El observador debe implementar la función observeValue(forKeyPath:of:change:context:)
  • La clases cuya propiedad va a ser observada autorizar al observador mediante la función addObserver(_:forKeyPath:options:context:)

La propiedad que vamos a observar

Primero vamos a programar una clases llamada Usuario que tendrá una propiedad llamada nombre de la que queremos estar informados cuando se produzca algún cambio en ella.

Como comentábamos antes, esta clase hereda de NSObjet y la propiedad tienes los atributos @objc y dynamic

El observador

Es la clases a la queremos que nos lleguen los avisos cuando cambien el nombre de la propiedad que estamos observando.

Recordemos que esta clases debe implementar la función observeValue que recibe como parámetros:

  • El keyPath de la propiedad que estamos observando
  • El objeto al que pertenene esa propiedad
  • Un diccionario del tipo [NSKeyValueChangeKey : Any] que contiene los cambios que se han producido
  • El contexto

Nos detendremos un momento en el diccionario y concretamente en el tipo de dato que hace las veces de clave. Este NSKeyvalueChangeKey es una estructura con valores estáticos que indican los diferentes tipos de cambios.

Puede ser newKey que indica que queremos saber el nuevo valor de la propiedad, u oldKey para saber el valor que tenía antes de producirse el cambio. Conviene darse una vuelta por la documentación para ver que otros valores tiene.

Y ahora ponemos el observador.

Añadir un observador para una propiedad es una tarea que recae en la clase propietaria de la propiedad.

Para hacerlo, el observador debe usar la función addObserver(_:forKeyPath:options:context:) a la que pasa como parámetros…

  • El objeto al que permitimos observar
  • El keyPath a la propiedad
  • Las opciones de observación, es decir, cuado queremos emitor un aviso
  • Y por último un contexto

Las opciones de observación son del tipo NSKeyValueObservingOptions y lo normal es indicar que queremos que se nos informe del nuevo valor de la propiedad con NSKeyValueObservingOptions.new y del valor que tenía antes de producirse mediante NSKeyValueObservingOptions.old

Conclusión

Como véis implementar el patrón Observer a la manera Apple es muy fácil. El playground de este artículo lo podéis encontrar en este repositorio de GitHub.

QUIZÁ TE INTERESE…

Adolfo Written by:

Me gustan las camisetas y las zapatillas de deporte. Desarrollo con Swift para iOS, macOS, watchOS y tvOS.. También UI/UX Me ha dado tiempo a publicar algunas apps y a escribir algún artículo. Una vez quedé segundo en un Hackathon.