관찰 가능
한 데이터 홀더 클래스메모리 누수
를 걱정할 필요가 없다!Observer 패턴
을 따르기 때문에 데이터가 변경되면, Observer 객체에 알린다이전에 개발했던, 특정 아이템 북마크 하는 기능이다.
private val _isBookMarked = MutableLiveData(false)
val isBookMarked: LiveData<Boolean> = _isBookMarked
북마크 선택 여부를 저장하는 isBookMarked 변수를 ViewModel 에 선언한다.
viewModel.isBookMarked.observe(viewLifecycleOwner) {
binding.btnBookmark.isSelected = it
}
isBookMarked 를 observe 하며, 선택 여부에 따라 isSelected 표시를 처리한다.
But!! 비동기 데이터 스트림을 처리하도록 설계되지 않음
=> Data Layer 에서 LiveData 를 쓰기 어려움
(그래서 Data Layer 에서 Flow 로 데이터 생성하고, Presentation 에서는 LiveData 로 observe 하는 방법을 사용하는 게 아닐까?)
모든 LiveDaata 객체가 메인 스레드
에서 관찰된다
lifecycle 을 알지 못함
=> repeatOnLifeCycle 사용하면 해결 가능
비동기적인 데이터 흐름
(suspend function 사용하기 때문에 메인쓰레드 차단하지 않고 데이터 생성 가능)
지속적으로 데이터를 방출한다 (emit
)
여러 값을 순차적으로 내보내기 때문에 DB에서 실시간으로 갱신된 값을 가져오는 데 적합하다.
Cold Stream 이란?
1. flow scope
내부에서 데이터가 생성된다.
flow{
for(i in 1..10){
delay(1000L)
emit(i)
}
}
```
2.Producer가 발생한 데이터를 동시에 여러 Consumer 가 수신
할 수 있다.
여러 Consumer가 같은 Producer를 구독하더라도, 각각 독립적으로 동작함.
collect()
하는 시점부터!CoroutineScope(Dispatchers.IO).launch {
count.collect{
Log.d("Count: ", it.toString())
}
}