web-dev-qa-db-ja.com

Transformations.switchMapを使用する方法と場所

Googleがリリースした最近のAndroid Architecture Componentsライブラリでは、Transformationsクラスに2つの静的関数があります。 map関数は単純明快で理解しやすいものですが、switchMap関数を適切に理解することは困難です。

SwitchMapの公式ドキュメントは here にあります。

誰かが実際の例でswitchMap関数の使用方法と場所を説明できますか?

34
Ehtesham Hasan

@DamiaFuentesの回答に2セントを追加します。

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

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

Transformations.switchMapメソッドは、userLiveDataに少なくとも1つのオブザーバーがある場合にのみ呼び出されます

11
Prakash

以下に示す@DamiaFuentes switchmap()関数の例の詳細を知りたい場合:

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

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

リポジトリにUser(1、 "Jane")およびUser(2、 "John")が含まれるシナリオでは、userIdLiveData値が "1"に設定されている場合、switchMapはgetUser(1)を呼び出し、LiveDataを返します。値User(1、 "Jane")が含まれています。そのため、userLiveDataはUser(1、 "Jane")を発行します。リポジトリ内のユーザーがUser(1、 "Sarah")に更新されると、userLiveDataは自動的に通知され、User(1、 "Sarah")を発行します。

SetUserIdメソッドがuserId = "2"で呼び出されると、userIdLiveDataの値が変更され、リポジトリからID "2"のユーザーを取得する要求が自動的にトリガーされます。したがって、userLiveDataはUser(2、 "John")を発行します。 repository.getUserById(1)によって返されるLiveDataは、ソースとして削除されます。

この例から、userIdLiveDataがトリガーであり、repository.getUserByIdによって返されるLiveDataが「バッキング」LiveDataであることがわかります。

詳細については、チェックアウトしてください: https://developer.Android.com/reference/Android/Arch/lifecycle/Transformations

6
Sonu Sanjeev