room - viewmodel android
¿Cómo y dónde usar Transformations.switchMap? (3)
En la reciente biblioteca de componentes de arquitectura de Android lanzada por Google, tenemos dos funciones estáticas en la clase Transformations
. Si bien la función de map
es sencilla y fácil de entender, me resulta difícil entender correctamente la función switchMap
.
La documentación oficial de switchMap se puede encontrar here .
¿Alguien puede explicar cómo y dónde usar la función switchMap con un ejemplo práctico?
Agregando mis 2 centavos a la respuesta de @DamiaFuentes.
MutableLiveData userIdLiveData = ...;
LiveData userLiveData = Transformations.switchMap(userIdLiveData, id ->
repository.getUserById(id)); // Returns LiveData
void setUserId(String userId) {
this.userIdLiveData.setValue(userId);
}
El método Transformations.switchMap solo se llamará cuando tengas al menos un observador para userLiveData
En la función map()
LiveData userLiveData = ...;
LiveData userName = Transformations.map(userLiveData, user -> {
return user.firstName + " " + user.lastName; // Returns String
});
userLiveData
vez que el valor de userLiveData
cambie, userName
también se actualizará. Observe que estamos devolviendo un String
.
En la función switchMap()
:
MutableLiveData userIdLiveData = ...;
LiveData userLiveData = Transformations.switchMap(userIdLiveData, id ->
repository.getUserById(id)); // Returns LiveData
void setUserId(String userId) {
this.userIdLiveData.setValue(userId);
}
userIdLiveData
vez que se userIdLiveData
al valor de los cambios de userIdLiveData
, se userIdLiveData
repository.getUserById(id)
, al igual que la función de mapa. Pero repository.getUserById(id)
devuelve un LiveData
. Así que cada vez que el valor de LiveData
devuelto por repository.getUserById(id)
cambie, el valor de userLiveData
también cambiará. Por lo tanto, el valor de userLiveData
dependerá de los cambios de userIdLiveData
y los cambios del valor de repository.getUserById(id)
.
Ejemplo práctico de switchMap()
: imagine que tiene un perfil de usuario con un botón de seguimiento y el siguiente botón de perfil que establece otra información de perfil. El siguiente botón de perfil llamará a setUserId () con otro id, por lo que userLiveData
cambiará y la interfaz de usuario cambiará. El botón Seguir llamará al DAO para agregar un seguidor más a ese usuario, de modo que el usuario tendrá 301 seguidores en lugar de 300. userLiveData
tendrá esta actualización que proviene del repositorio, que proviene del DAO.
Para aquellos que desean una explicación más detallada de la función @DamiaFuentes switchmap () que se muestra a continuación:
MutableLiveData userIdLiveData = ...;
LiveData userLiveData = Transformations.switchMap(userIdLiveData, id ->
repository.getUserById(id));
void setUserId(String userId) {
this.userIdLiveData.setValue(userId);
}
En un escenario donde el repositorio contiene Usuario (1, "Jane") y Usuario (2, "John"), cuando el valor userIdLiveData se establece en "1", el switchMap llamará a getUser (1), que devolverá un LiveData que contiene el valor Usuario (1, "Jane"). Así que ahora, el userLiveData emitirá User (1, "Jane"). Cuando el usuario en el repositorio se actualiza al Usuario (1, "Sarah"), el UserLiveData recibe una notificación automática y emitirá un Usuario (1, "Sarah").
Cuando se llama al método setUserId con userId = "2", el valor de userIdLiveData cambia y activa automáticamente una solicitud para obtener el usuario con el ID "2" del repositorio. Por lo tanto, el userLiveData emite User (2, "John"). El LiveData devuelto por repository.getUserById (1) se elimina como fuente.
De este ejemplo, podemos entender que userIdLiveData es el desencadenante y el LiveData devuelto por repository.getUserById es el LiveData de "respaldo".
Para obtener más información, consulte: https://developer.android.com/reference/android/arch/lifecycle/Transformations