[Kotlin] Flow - Latest

KSang·2024년 5월 9일
0

TIL

목록 보기
99/101

Flow의 메소드를 더 알아보자

suspend fun main() = coroutineScope {

    val flow = flow {
        repeat(5) {
            val pancakeIndex = it + 1
            println("Emitter:    Start Cooking Pancake $pancakeIndex")
            delay(100)
            println("Emitter:    Pancake $pancakeIndex ready!")
            emit(pancakeIndex)
        }
    }

    flow.collectLatest {
        println("Collector:  Start eating pancake $it")
        delay(300)
        println("Collector:  Finished eating pancake $it")
    }
}

flow에는 collectLatest라는게 있는데, 가장 최신화된 데이터만 받아오게 된다.

이 함수를 실행하게 된다면

Emitter:    Start Cooking Pancake 1
Emitter:    Pancake 1 ready!
Collector:  Start eating pancake 1
Emitter:    Start Cooking Pancake 2
Emitter:    Pancake 2 ready!
Collector:  Start eating pancake 2
Emitter:    Start Cooking Pancake 3
Emitter:    Pancake 3 ready!
Collector:  Start eating pancake 3
Emitter:    Start Cooking Pancake 4
Emitter:    Pancake 4 ready!
Collector:  Start eating pancake 4
Emitter:    Start Cooking Pancake 5
Emitter:    Pancake 5 ready!
Collector:  Start eating pancake 5
Collector:  Finished eating pancake 5

collect내부에 작업이 수행중임에도 emit되는 순간 새로운 기존의 수행중인 로직을 무시하고 새로 포착된 로직을 수행한다

데이터를 최신화하기 위해서 사용된다.

suspend fun main() = coroutineScope {

    val flow = flow {
        repeat(5) {
            val pancakeIndex = it + 1
            println("Emitter:    Start Cooking Pancake $pancakeIndex")
            delay(100)
            println("Emitter:    Pancake $pancakeIndex ready!")
            emit(pancakeIndex)
        }
    }.mapLatest {
        println("Add topping onto the pancake $it")
        delay(200)
        it
    }

    flow.collect {
        println("Collector:  Start eating pancake $it")
        delay(300)
        println("Collector:  Finished eating pancake $it")
    }
}

mapLatest 메소드를 이용하면 emit된 요소를 변환하기 시작한다.

그런데 작업중 새로운 emit이 들어오게 되면 기존의 작업을 무시하고 최신화된 작업을 수행한다.

이때 변환이 완료된다음 collect에서 포착된다.

suspend fun main() = coroutineScope {

    val flow = flow {
        repeat(5) {
            println("Emitter:    Start Cooking Pancake $it")
            delay(100)
            println("Emitter:    Pancake $it ready!")
            emit(it)
        }
    }.conflate()

    flow.collect {
        println("Collector:  Start eating pancake $it")
        delay(300)
        println("Collector:  Finished eating pancake $it")
    }
}

conflate를 사용하면 데이터 스트림 처리에서 중간의 데이터를 건너뛰고 가장 최근의 데이터만 유지하는 전략을 사용한다.

콜렉터가 아직 처리 중인 데이터가 있을 때 새 데이터가 방출되면, 기다리고 있던 중간 데이터들은 버려지고 가장 최근의 데이터만 유지된다.

즉, 콜렉터가 준비될때 최신 데이터만 전달받아 처리하게 된다.

빠른 데이터 스트림에서 최신 상태를 유지하면서 리소스 사용을 최적화하고 싶을 때 적합한 메소드

0개의 댓글