본문 바로가기

JAVA/Android

[kotlin][Android] collect와 collectLatest의 차이

collect와 collectLatest 는 데이터를 처리하는 방식으로,

코루틴의 데이터 파이프 라인인 Flow에서 발행하는 데이터를 소비할 때 이용한다.

 

방식은 collect와 collectLatest 두 가지가 있으며 두 방식의 차이를 소개해 보겠다.

 

collect는 순차적으로 데이터를 처리하며, 앞서 들어온 데이터 처리가 모두 끝나기 전까지 다음 데이터를 처리하지 않는다. 발생할 수 있는 이슈는 데이터를 처리하다가 중간에 작업이 원활하지 못해 시간이 무제한으로 소비된다면, 다음에 들어올 데이터들은 영원히 처리될 수 없는 것 등이 있다.

 

collectLatest는 마찬가지로 순차적으로 데이터를 처리하는데, 데이터 처리를 시작하는 것은 순차적이지만, 처리 도중 다음 데이터가 들어온다면 앞서 들어온 데이터 처리를 완전히 중단하고 늦게 들어온 데이터를 처리한다.

이 방식을 사용할 경우, 들어오는 모든 데이터를 처리하여 적재해야 하는 작업을 할 때는 적합하지 않으며 마지막에 들어오는 데이터만 정상적으로 처리될 수 있다.

 

ex) 데이터를 처리하는 시간이 500ms이고, 데이터를 발행하는 시간이 100ms일 경우 데이터가 미처 처리되지 못한 채 다음 데이터가 발행되어 마지막 데이터만 정상적으로 처리 됨

val dataEditFlow = flow {
    for (i in 1..10) {
        emit(i)
        delay(100)
    }
}

fun sendData() {
    lifecycleScope.launch {
        dataEditFlow.collect {
            delay(500) // 데이터를 처리하는 시간
            println("${it}번째 데이터 처리")
        }
    }
}

 

단점을 정리해보자면

 

collect의 경우 중간에 데이터가 어떤 이유로 데이터를 처리하는데 시간이 오래 걸린다면 그 이후에 데이터를 받을 수 없다

 

collectLatest의 경우 이전 데이터 처리가 끝나지 않더라도 새로운 데이터가 들어오면 데이터를 새로 받아서 그런일은 없지만 그렇게 된다면 마지막 데이터만 들어오고 중간 데이터를 받을 수 없다

→ 화면에 표시하여 사용자에게 보여줘야 하는 데이터 ex.이미지 갱신, 카운트 갱신 등

 

두 방식은 기능이 다르므로 사용 목적에 맞게 사용하면 되겠다

 

예를 들어 화면에 표시해야 하는 데이터는 collectLatest로 처리하여 표시하면 빠르게 UI를 갱신할 수 있고,

(EX. 이미지 갱신, 카운트 갱신 등)

처리된 데이터들을 list 로 적재하는 등 저장되어야 하는 데이터들은 collect로 처리하면 적절하다고 볼 수 있겠다.