[Android] LiveData & 옵저버패턴(map,switchMap)

김민주·2022년 10월 24일
0

Android

목록 보기
9/21

LiveData란?

  • 관찰 가능한 데이터 홀더 클래스
  • 관찰 가능한 일반 클래스와 달리 수명 주기를 인식
  • 수명 주기 인식을 통해 활동 수명 주기 상태에 있는 앱 구성요소 관찰자만 업데이트

즉, 수명주기를 반영하면서 값의 변경을 감지하는 데이터 홀더


LiveData 이점

  • UI와 데이터 상태의 일치 보장

    앱 데이터가 변경될 때마다 관찰자가 대신 UI를 업데이트하므로 개발자가 업데이트할 필요가 없음.

  • 메모리 누수 없음

    관찰자는 Lifecycle 객체에 결합되어 있으며 연결된 수명 주기가 끝나면 자동으로 삭제됨.

  • 중지된 활동으로 인한 비정상 종료 없음

    활동이 백 스택에 있을 때를 비롯하여 관찰자의 수명 주기가 비활성 상태에 있으면 관찰자는 어떤 LiveData 이벤트도 받지 않음.

  • 최신 데이터 유지

    수명 주기가 비활성화되면 다시 활성화될 때 최신 데이터를 수신함.
    예를 들어 백그라운드에 있었던 활동은 포그라운드로 돌아온 직후 최신 데이터를 받음.

  • 적절한 구성 변경
    기기 회전과 같은 구성 변경으로 인해 활동 또는 프래그먼트가 다시 생성되면 사용 가능한 최신 데이터를 즉시 받음.

  • 리소스 공유
    LiveData 객체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 관찰자가 LiveData 객체를 볼 수 있음.



Observer Pattern

: 데이터의 변경이 발생했을 경우 상대 클래스나 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 유용한 디자인 패턴

  • subject의 상태변화를 관찰하는 옵져버들을 객체와 연결하여 Event 발생 시 객체가 옵져버에게 이벤트 알려줌



옵져버 패턴을 사용하는 라이브러리

1. Observable

  • 콜백 등록
    • lifecycle을 알 수 없어 callback이 상시 동작되어야 함
    • 동작이 필요 없어지면 callback 제거(removeOnPropertyChangedCallback)

2. LiveData

  • lifecycleOwner 전달

    • lifecycle이 활성화 속성인 started or resumed 경우에만 observe 실행 (나머지 속성에서는 비활성화)
    • LiveData (= immutable) / MutableLiveData



Transformations

: LiveData를 변형시키기 위한 Class.


  • 관찰자에게 LiveData 객체를 전달하기 전에 객체에 저장된 값을 변경하고 싶은 경우
  • 다른 객체의 값에 따라 다른 LiveData 인스턴스를 반환해야 하는 경우
    (하나의 데이터가 변경될 때, 다른 데이터들도 변경해야 하는 경우 사용됨)

Transformations의 두가지 메소드

  • map

    • map 내부에서 객체 리턴
    val userLiveData: LiveData<User> = UserLiveData()
    val userName: LiveData<String> =     Transformations.map(userLiveData) {
        user -> "${user.name} ${user.lastName}"
    }
  • switchMap

    • 데이터 변환 처리 함수에서 객체 리턴
    • 두번째 파라미터 LiveData<>형이라 Room 등 LiveData를 지원하는 다른 라이브러리들과 사용가능
      private fun getUser(id: String): LiveData<User> {
      }
       val userId: LiveData<String> = ...
       val user = Transformations.switchMap(userId) { id ->       getUser(id) }




참고
안드 개발자 문서 livedata
알기쉬운 modern android

profile
𝐃𝐨𝐧'𝐭 𝐛𝐞 𝐚 𝐩𝐫𝐨𝐜𝐫𝐚𝐬𝐭𝐢𝐧𝐚𝐭𝐨𝐫💫

0개의 댓글