
관찰 가능한 데이터 홀더 클래스메모리 누수를 걱정할 필요가 없다!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())
}
}