Groo

collect와 collectLatest의 차이 본문

프로그래밍 언어/Kotlin

collect와 collectLatest의 차이

김주엽 2022. 4. 3. 15:13

아래 내용은 모두 해당 원글을 기반으로 요약정리한 내용입니다.

그림은 저자가 직접 제작한 것임을 알려드립니다. (출처: Kt World)


Flow는 emit을 통해 데이터를 발행하고 collect의 action 파라미터에 의해 소비된다.

collect의 action 블록에서는 발행된 데이터를 순차적으로 받아 suspend fun을 수행한다.

public suspend inline fun <T> Flow<T>.collect(crossinline action: suspend (value: T) -> Unit): Unit =
    collect(object : FlowCollector<T> {
        override suspend fun emit(value: T) = action(value)
    })

collect는 새로운 데이터가 발행되더라도 이전 데이터의 처리가 끝날 때까지 대기한다.

특정 데이터의 처리 시간이 무제한 소요된다면 이후에 새롭게 발행된 데이터는 처리할 수 없다.

 

val omakaseFlow = flow {
    for (i in 1..10) {
        emit(i)
        delay(100) // 셰프가 오마카세 만드는 소요시간
    }
}

fun eatOmakase() {
    lifecycleScope.launch {
        omakaseFlow.collect {
            delay(1000) // 손님이 오마카세 먹는 소요시간
            println("${it}번째 오마카세 식사 완료")
        }
    }
}

// 1번째 오마카세 식사 완료
// 2번째 오마카세 식사 완료
// 3번째 오마카세 식사 완료
// 4번째 오마카세 식사 완료
// 5번째 오마카세 식사 완료
...

collectLatest는 새로운 데이터가 발행되면 이전 데이터의 처리를 취소하고 새로운 데이터의 처리를 시작한다.

데이터의 발행 속도가 소비의 속도보다 빠르다면 대부분의 데이터는 모두 취소되고 마지막 데이터만 정상 소비된다.

 

val omakaseFlow = flow {
    for (i in 1..10) {
        emit(i)
        delay(100) // 셰프가 오마카세 만드는 소요시간
    }
}

fun eatOmakase() {
    lifecycleScope.launch {
        omakaseFlow.collectLatest {
            delay(1000) // 손님이 오마카세 먹는 소요시간
            println("${it}번째 오마카세 식사 완료")
        }
    }
}

// 10번째 오마카세 식사 완료

collectLatest 역시 문제상황에 맞게 선택적으로 사용하면 되겠다.


이번에는 collect와 collectLatest의 차이에 대해서 알아봤다.

오늘은 애플망고스무디를 골랐는데 맛없다 😑

Comments