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로 처리하면 적절하다고 볼 수 있겠다.