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이다. 따라서 userLiveData
와 userNameLiveData
는 서로 독립적인 객체인 것처럼 느껴진다. 그러나 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/
더 좋은 자료
'모바일 > Android_Kotlin' 카테고리의 다른 글
Generic 클래스와 함수 정리 (0) | 2021.06.04 |
---|---|
[kotlin] 코루틴이란?, runBlocking?, suspendCancellableCoroutine (0) | 2021.06.03 |
AndroidManifest.xml receiver tag is incompatible with attribute description (attr) reference. (0) | 2021.03.08 |
DataBinding – Two-way(양방향) Databinding with Custom View (0) | 2021.03.04 |
take (0) | 2020.12.17 |