LiveData - Transformations.map, switchMap

2021. 6. 3. 13:40모바일/Android_Kotlin

LiveData - Transformations.map, switchMap

  • 하나의 데이터가 바뀔 때마다 다른 여러 데이터들도 함께 바뀌어야하는 상황을 많이 만나게 됩니다.

  • 또 Room이나 Retrofit 등 데이터베이스나 네트워크 통신을 도와주는 라이브러리와 함께 사용되기도 합니다.

    이럴 때 사용하는 것이 바로 Transformations 의 map 과 switchMap 메소드입니다.

Transformations.map

코틀린 컬렉션에서 제공하는 map은 위에서 보듯이 요소 각각에 2를 곱해 새로운 List를 반환한다. 포인트는 새로운 List를 반환한다는 것이다.

Transformations.map역시 마찬가지다.

val userLiveData: MutableLiveData<User> = repository.getUser(id)
val userNameLiveData: LiveData<String> = Transformations.map(userLiveData) { user ->
    user.firstName + " " + user.lastName
}

공식문서의 코드 샘플을 약간 수정했다.

  • map의 첫 번째 인자로 LiveData source를 넘겨준다. 넘겨준 LiveData source 가 변경될 때마다 map이 반환하는 새로운 LiveData의 value역시 새롭게 갱신된다.
  • 두 번째 인자로는 함수를 넘겨준다. 함수의 파라미터 타입은 source로 넘겨준 LiveData의 value Type(``)이며 함수의 return값은 무엇이든 상관없다.
  • Transformations.map의 return 값(람다의 결과물 말고)은 LiveData이다. 기존 컬렉션의 map이 그러하듯 Transformations.map 역시 내용물 요소의 값만 변환 시킬 뿐 LiveData를 리턴한다.

직관적으로 보면 userNameLiveData는 그저 userLiveData의 User 이름만 추출하여 새롭게 만든 LiveData이다. 따라서 userLiveDatauserNameLiveData는 서로 독립적인 객체인 것처럼 느껴진다. 그러나 userNameLiveData의 value는 userLiveData의 value가 바뀔 때 마다 함께 갱신된다.

Transformations.switchMap

Transformations.switchMap 은 map 메소드와 비슷합니다만 차이점이 있다면 두 번째 파라미터로 들어오는 함수형 인터페이스 내 메소드의 리턴 타입이 값이 아닌 LiveData 타입이라는 것입니다. 이는 Room 등 LiveData를 지원하는 다른 라이브러리들과 함께 사용하기에 좋습니다.

참조 : https://wooooooak.github.io/android/2019/07/13/liveData%EB%B3%80%ED%98%95%ED%95%98%EA%B8%B0/

더 좋은 자료