it-swarm.com.de

Wie und wo verwende ich Transformations.switchMap?

In der kürzlich von Google veröffentlichten Android Architecture Components-Bibliothek haben wir zwei statische Funktionen in der Transformations-Klasse. Während die map-Funktion einfach und leicht verständlich ist, fällt es mir schwer, die switchMap-Funktion richtig zu verstehen.

Die offizielle Dokumentation von switchMap finden Sie hier .

Kann jemand erklären, wie und wo man die switchMap-Funktion anhand eines praktischen Beispiels verwenden kann?

23
Ehtesham Hasan

In der Funktion map()

LiveData userLiveData = ...;
LiveData userName = Transformations.map(userLiveData, user -> {
     return user.firstName + " " + user.lastName; // Returns String
});

jedes Mal, wenn sich der Wert von userLiveData ändert, wird auch userName aktualisiert. Beachten Sie, dass wir eine String zurückgeben. 

In der Funktion switchMap():

MutableLiveData userIdLiveData = ...;
LiveData userLiveData = Transformations.switchMap(userIdLiveData, id ->
    repository.getUserById(id)); // Returns LiveData

void setUserId(String userId) {
     this.userIdLiveData.setValue(userId);
}

jedes Mal, wenn sich der Wert von userIdLiveData ändert, wird repository.getUserById(id) aufgerufen, genau wie die Map-Funktion. repository.getUserById(id) gibt jedoch eine LiveData zurück. Jedes Mal, wenn sich der von repository.getUserById(id) zurückgegebene Wert der LiveData ändert, ändert sich auch der Wert von userLiveData. Der Wert von userLiveData hängt also von Änderungen von userIdLiveData und Änderungen von repository.getUserById(id) ab.

Praktisches Beispiel für switchMap(): Stellen Sie sich vor, Sie haben ein Benutzerprofil mit einem Folgeschalter und einem nächsten Profilknopf, der weitere Profilinformationen festlegt. Die nächste Profil-Schaltfläche ruft setUserId () mit einer anderen ID auf, sodass sich userLiveData und die Benutzeroberfläche ändern. Der Follow-Button ruft das DAO an, um diesem Benutzer einen weiteren Follower hinzuzufügen. Der Benutzer hat also 301 Follower anstelle von 300. userLiveData enthält dieses Update aus dem Repository, das vom DAO stammt. 

41
Damia Fuentes

Hinzufügen von 2 Cent zu @DamiaFuentes Antwort.

MutableLiveData userIdLiveData = ...;
LiveData userLiveData = Transformations.switchMap(userIdLiveData, id ->
repository.getUserById(id)); // Returns LiveData

void setUserId(String userId) {
     this.userIdLiveData.setValue(userId);
}

Die Transformations.switchMap-Methode wird nur aufgerufen, wenn Sie mindestens einen Beobachter für userLiveData haben

6
Prakash

Für diejenigen, die mehr über @DamiaFuentes Funktionsweise der switchmap () - Funktion erfahren möchten:

 MutableLiveData userIdLiveData = ...;
 LiveData userLiveData = Transformations.switchMap(userIdLiveData, id ->
     repository.getUserById(id));

 void setUserId(String userId) {
      this.userIdLiveData.setValue(userId);
 }

In einem Szenario, in dem das Repository Benutzer (1, "Jane") und Benutzer (2, "John") enthält, wenn der userIdLiveData-Wert auf "1" gesetzt ist, ruft die switchMap getUser (1) auf, die eine LiveData zurückgibt mit dem Wert User (1, "Jane"). Jetzt wird UserLiveData User (1, "Jane") ausgeben. Wenn der Benutzer im Repository auf Benutzer (1, "Sarah") aktualisiert wird, wird der BenutzerLiveData automatisch benachrichtigt und gibt Benutzer (1, "Sarah") aus.

Wenn die setUserId-Methode mit userId = "2" aufgerufen wird, ändert sich der Wert von userIdLiveData und löst automatisch eine Anforderung aus, um den Benutzer mit der ID "2" aus dem Repository zu erhalten. So gibt der UserLiveData User (2, "John") aus. Die von repository.getUserById (1) zurückgegebenen LiveData-Daten werden als Quelle entfernt.

In diesem Beispiel können wir verstehen, dass userIdLiveData der Auslöser ist und die von repository.getUserById zurückgegebenen LiveData die "unterstützende" LiveData sind.

Weitere Informationen finden Sie unter: https://developer.Android.com/reference/Android/Arch/lifecycle/Transformations

1
Sonu Sanjeev