SwiftUI Fundamentals (Cap 2): Observed Object - State Object

En el Cap. 1: @State & @Binding pudimos ver que las propiedades de estado proporcionan una forma de almacenar localmente el estado de una vista, están disponibles sólo para la vista local y, como tales, no pueden ser accedidas por otras vistas a menos que sean subvistas y se implemente la vinculación de estado. Las propiedades de estado también son transitorias en el sentido de que cuando la vista padre desaparece, el estado también se pierde. Los objetos observables, por otro lado, se utilizan para representar datos persistentes que son externos y accesibles a múltiples vistas.

Observable Object

Un objeto “Observable” adopta la forma de una class o struct que se ajusta al protocolo ObservableObject. Este objeto observable publica los valores de los datos que es responsable, en este caso, de todas sus propiedades @Published.

En el siguiente ejemplo tenemos un objecto “DemoData” que incluye dos variables @Published. Y una vista llamada “ContentViewDemo”.

El wrapper @Published simplemente envía actualizaciones a todos los suscriptores cada vez que cambia el valor de la propiedad. Cualquier objeto de tipo @ObserverObject que sea una instancia de @ObservableObject, en este ejemplo, cualquier instancia de “DemoData”, recibirá como suscriptor un cambio de estado. La relación entre variables es bastante simple. Tenemos un “publicador” que envía actualizaciones a cualquier “suscriptor”. @Published @ObservableObject

Nota: Combine está disponible a partir de iOS 13, macOS 10.15, tvOS 13 y watchOS 6. Nota: No olvidar la dualidad @StateObject vs @ObservedObject. Son similares, pero @ObservedObject puede ser destruido en las recreaciones de las vistas. Consultar la siguiente sección

Digital Lover

State Object

Como hemos visto en el ejemplo anterior, el wrapper @ObservedObject no es exclusivo.

Como regla general, a menos que exista una necesidad específica de utilizar @ObservedObject, la recomendación es utilizar un objeto de estado, es decir, declarar el objeto con wrapper @StateObject para suscribirse a objetos observables. @ObservedObject no debe ser usado para crear objetos. Usa este wrapper solo con objetos que han sido creados en otro lugar, de lo contrario SwiftUI podría destruir accidentalmente el objeto. Nota: Una regla sencilla es la siguiente: si ves "state" en el nombre de un wrapper de una propiedad, significa que esa vista es la responsable y posee los datos. Nota: Si alguna vez vemos:

El wrapper debería ser @StateObject para que SwiftUI sepa que la vista debe poseer los datos en lugar de referirse a ellos en otro lugar. Usar @ObservedObject aquí puede causar que tu aplicación pueda “crashear” porque el objeto es destruido prematuramente. Nota: @StateObject está disponible a partir de iOS 14, macOS 11, tvOS 14 y watchOS 7.

 

 

Tags

He leído y acepto la política de privacidad
Acepto recibir emails sobre actividades de recruiting NTT DATA