Hanbit the Developer

cold stream vs hot stream in code 본문

Mobile/Kotlin

cold stream vs hot stream in code

hanbikan 2024. 2. 6. 17:00

배경

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이다.