Hanbit the Developer
cold stream vs hot stream in code 본문
배경
Flow는 구독(collect 등) 시작 시점에 동작을 시작하는 cold stream이고, StateFlow는 구독자의 구독 시점과 상관없이 동작을 시작할 수 있는 hot stream이다.
이 주제에 대해 말로만 인지하고 있었어서 코드로 확인해보고 싶었다.
동작 확인
Flow
class FlowViewModel : ViewModel() {
val tmp: Flow<Int> = flow {
val nums = listOf(1,2,3,4,5,6,7,8,9,10)
nums.forEach {
delay(1000)
emit(it)
}
}
fun onClick() {
viewModelScope.launch {
tmp.collect { Log.e("tmp", it.toString()) }
}
}
}
위 코드를 실행하고 3초 뒤에 collect를 호출했을 때 1~10이 로깅되었다. 즉 관측하기 전에는 플로우가 시작조차 되지 않는다는 것이다.
StateFlow
class FlowViewModel : ViewModel() {
val tmp: StateFlow<Int> = flow {
val nums = listOf(1,2,3,4,5,6,7,8,9,10)
nums.forEach {
delay(1000)
emit(it)
}
}
.stateIn(viewModelScope, SharingStarted.Eagerly, 0) // ADDED: Flow를 StateFlow로 바꿔주는 함수
fun onClick() {
viewModelScope.launch {
tmp.collect { Log.e("tmp", it.toString()) }
}
}
}
기존 코드에서 Flow를 hot stream인 StateFlow로 바꿔주고 3초 뒤에 collect 하였더니 4~10이 출력되었다.
결론
Flow는 구독(collect 등) 시작 시점에 동작을 시작하는 cold stream이고, StateFlow는 구독자의 구독 시점과 상관없이 동작을 시작할 수 있는 hot stream이다.
'Kotlin' 카테고리의 다른 글
[Kotlin] Suspend Function Implementation (0) | 2024.03.09 |
---|---|
Coroutines Flow | SharingStarted (1) | 2024.02.06 |
Effective Kotlin | 8장. 효율적인 컬렉션 처리 (0) | 2023.09.11 |
Effective Kotlin | 7장. 비용 줄이기 (0) | 2023.09.11 |
Effective Kotlin | 6장. 클래스 설계 (0) | 2023.08.12 |