티스토리 뷰

collect() != collectLatest()

collect() => It collects every value that  theoriginal flow emits and it is recommended to use when all received data should be processed. 

collectLatest() => It collects every value, but stops to work for the previous value when the original flow emits a new value. It is fairly for the case when the latest data should be processed. 

val countFlow = flow<Int> {
        val startingVal = 5
        var currVal = startingVal
        emit(startingVal)

        while(currVal > 0 ) {
            delay(1000L)
            currVal--
            emit(currVal)
        }
    }

   private fun collectFlow() {
        viewModelScope.launch {
            // It prints only once - "The current count is 0".
            countFlow.collectLatest {cnt ->
                delay(1300L)
                println("The current count is $cnt")
            }
            // It prints a log every sec.
            countFlow.collect {cnt ->
                delay(1300L)
                println("The current count is $cnt")
            }
        }
    }

 

.buffer() / .conflate()

buffer() => flows emissions via channel of a specified capacity and runs collector in a sperate coroutine

conflate() => flow emissions via conflated channel and runs collector in a specified coroutine. Emitter is NEVER suspended due to a slow collector, but collector always gets the most recent value emitted. 

 private fun collectFlow() {
        val flow = flow {
            delay(200L)
            emit("Coleslaw")
            delay(700L)
            emit("Burger")
            delay(500L)
            emit("Ice Cream")
        }

        viewModelScope.launch {
            flow.onEach {
                Log.d(Tag, "$it is served.")
            }
                .buffer()
//                .conflate()
                .collect{
                    Log.d(Tag, "$it is being eaten.")
                    delay(1500L)
                    Log.d(Tag, "$it is eaten.")
                }
        }
    }
collect() buffer() + collect() conflate() + collect() collectLatest()
Coleslaw is served Coleslaw is served Coleslaw is served Coleslaw is served
Coleslaw is being eaten Coleslaw is being eaten Coleslaw is being eaten Coleslaw is being eaten
Coleslaw is eaten Burger is served Burger is served X
Burger is served Ice Cream is served Ice Cream is served Burger is served
Burger is being eaten Coleslaw is eaten Coleslaw is eaten Burger is being eaten
Burger is eaten Burger is being eaten X X
Ice Cream is served Burger is eaten X Ice Cream is served
Ice Cream is being eaten Ice Cream is being eaten Ice Cream is being eaten Ice Cream is being eaten
Ice Cream is eaten Ice Cream is eaten Ice Cream is eaten Ice Cream is eaten