Googleがリリースした最近のAndroid Architecture Componentsライブラリでは、Transformations
クラスに2つの静的関数があります。 map
関数は単純明快で理解しやすいものですが、switchMap
関数を適切に理解することは困難です。
SwitchMapの公式ドキュメントは here にあります。
誰かが実際の例でswitchMap関数の使用方法と場所を説明できますか?
@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つのオブザーバーがある場合にのみ呼び出されます
以下に示す@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