[Android A..Z] Flow collect vs collectLatest

2024. 3. 30. 03:12개발/[Kotlin] 안드로이드 개발

반응형

https://kotlinworld.com/252 너무 잘 정리되어 있는 글을 바탕으로 이해하기 쉽게 요약한다.

 

Collect

데이터를 수집하는데, suspend fun 수행이 끝나면 다음 suspend fun을 수행한다

즉 아래 코드를 보면 collect 시점에서 해당 스코프가 끝이나면 다시 수집하는 형식

값 하나를 print 하는데 1초가 걸리고 총 10초가 걸려서 값이 찍힌다.

val flow = flow<Int> {
        for (i in 0..10) {
            emit(i)
            delay(100L)
        }
    }
    
    init {
        viewModelScope.launch { 
            flow.collect {
                println("!!!방출된 값 $it")
                delay(1000L)
            }
        }
    }

CollectLatest

collectLatest는 항상 최신 데이터를 소비한다. 데이터가 들어온다면 많은 시간이 걸리는 연산도 무시하고 데이터를 발행한다.

아래 코드를 실행시키면 1초에 모든 값들이 방출된다.

즉 delay(1000L)을 취소하고 최신 데이터가 들어온다면 새로운 데이터로 발행된다.

val flow = flow<Int> {
        for (i in 0..10) {
            emit(i)
            delay(100L)
        }
    }

    init {
        viewModelScope.launch {
            flow.collectLatest {
                println("!!!방출된 값 $it")
                delay(1000L)
            }
        }
    }
반응형