본문 바로가기

개발 노트/Kotlin

[Android/Kotlin] collect과 collectLatest의 차이점? [Flow]

 

collect는 flow에서 발행되는 모든 데이터를 순서대로 처리하는데 반해,

collectLatest는 flow에 새로운 데이터가 들어오면 기존 suspend 작업을 버리고 새로운 suspend 작업을 수행한다

 

paging에서는 flow 데이터가 시간에 따라 계속 갱신되고 기존 데이터는 무효화되는 구조를 갖고 있으므로 구글은 UI에 expose하는 데이터에 대해서는 collect가 아닌 collectLatest를 쓰도록 권장하고 있다

https://medium.com/androiddevelopers/fetching-data-and-binding-it-to-the-ui-in-the-mad-skills-series-cea89868b3e1

 

 

 

 

# collect과 collectLatest의 차이점은 무엇일까?

Flow의 collect과 collectLatest의 차이는 새로운 데이터가 들어왔을때의 처리방식에 있다

 

 

- collect

collect는 그림과같이 새로운 데이터가 들어왔을때, 이전 데이터의 처리가 끝난후에! 새로운 데이터를 처리한다

collect로 데이터를 소비하게 되면 데이터가 발행 속도가 소비 속도보다 더 빠를경우 소비가 지연된다

(데이터2가 많은 시간을 잡아먹을 경우,  최신 데이터인 데이터3이 화면에 표기되는데 지연이 발생한다

만약 중간에 있는 데이터가 처리되는데 무제한 시간을 잡아먹게 되면, 이후 발행되는 데이터들은 모두 처리가 되지 않을 것이다)

 

 

따라서 0.1초마다 발행되어 0부터 10까지의 숫자가 1초만에 모두 발행이 끝났음에도, 한 개를 처리하는데 1초씩 걸려서 10개를 모두 print 하는데는 10초나 걸리게 된다

 

 

 

- collectLatest

 

 

 

반면, collectLatest새로운 데이터가 들어오면, 이전 데이터의 처리를 강제 종료시키고 새로운 데이터를 처리한다

최신 데이터가 들어왔을 때 이전 데이터를 이용해 수행하던  suspend fun을 취소하고 새로 들어온 데이터로 suspend fun을 수행하도록 만드는 것이다

따라서 collect보다 collectLatest를 이용해 UI에 표기하는 것이 사용자에게 더욱 나은 사용자 경험을 만들어 줄 것이다

 

 

 

# collectLatest의 한계

그치만 collectLatest도 한계가 있다.

collectLatest가 성공적으로 새로운 데이터를 처리하는 경우는 데이터를 print한 후 delay를 시켰을때인데,

실제 사용시에는 delay가 일어난 후 print되는것이 일반적일 것이다

 

 

그럴경우, 그림과 같이 데이터 발행 시간 사이의 간격보다 데이터를 처리하는 suspend fun이 수행하는 시간이 오래 걸릴 경우, 새로 들어온 데이터는 계속해서 취소되게 된다.

즉, 이런 상황에서 collectLatest를 쓸 경우, 중간 데이터를 하나도 얻지 못하고 마지막 데이터만을 얻을 수 있다.

 

 

flow는 이러한 상황에 대비하기 위해, 다양한 옵션을 제공한다는데,,, 이부분은 다음번에 또 학습해봐야겠다

 

 

 

 

 

 

 

 

 

 

출처: https://kotlinworld.com/252#Flow의 collect와 collectLatest 차이는 무엇인가%3F-1 

 

 

# 참고자료

https://kotlinworld.com/252

 

[Coroutine Flow] collect와 collectLatest의 차이는 무엇인가?

collect를 사용한 데이터 소비의 한계점 Flow는 Coroutine상에서 Reactive한 프로그래밍을 할 수 있도록 만들어진 데이터 파이프 라인이다. Flow는 데이터를 발행하는 역할을 하며 Flow에서 발행하는 데이

kotlinworld.com