Programming Language/Kotlin
[Kotlin] Flow zip 연산자로 long- running tasks in parallel 처리하기
Tenacity_Dev
2024. 3. 2. 19:59
728x90
Kotlin Flow의 zip 연산자란
Zip 연산자는 지정된 함수를 통해서 두 흐름 컬럭션의 방출을 함께 결합하고 이 함수의 결과를 기반으로 각 조합에 대해 단일 항목을 방출하는 연산자이다.
예제 코드
val flowOne = flowOf(1, 2, 3)
val flowTwo = flowOf("A", "B", "C")
flowOne.zip(flowTwo) { intValue, stringValue ->
"$intValue$stringValue"
}.collect {
println(it)
}
출력
1A
2B
3C
Android의 실제 사용 사례
두 작업을 병렬로 실행하고 두 작업이 모두 완료되면 단일 콜백에서 두 작업의 결과를 원하는 경우
장기 실행 작업 1
private fun doLongRunningTaskOne(): Flow<String> {
return flow {
// your code for doing a long running task
// Added delay to simulate
delay(5000)
emit("One")
}
}
장기 실행 작업 2
private fun doLongRunningTaskTwo(): Flow<String> {
return flow {
// your code for doing a long running task
// Added delay to simulate
delay(5000)
emit("Two")
}
}
zip연산자를 사용하는 경우
fun startLongRunningTask() {
viewModelScope.launch {
doLongRunningTaskOne()
.zip(doLongRunningTaskTwo()) { resultOne, resultTwo ->
return@zip resultOne + resultTwo
}
.flowOn(Dispatchers.Default)
.catch { e ->
// handle exception
}
.collect {
// result
}
}
}
출력
OneTwo
여기서는 zip 연산자를 사용했기 때문에 두 작업을 병렬로 실행하고 두 작업이 모두 완료되면 단일 콜백으로 두 작업의 결과를 제공한다.
Zip 연산자를 사용하여 두 개의 흐름 컬렉션을 압축하면 두 작업이 병렬로 실행된다. 그리고 둘 다 완료되면 결과를 얻는다. 이러한 방식으로 우리는 한 번에 두 흐름 컬렉션의 결과를 얻는다.
Kotlin Flow의 Zip 연산자의 장점:
- 작업을 병렬로 실행한다.
- 모든 작업이 완료되면 단일 콜백으로 작업 결과를 반환한다.
이 방법으로 우리는 작업을 병렬로 실행하기 위해 Kotlin의 Flow의 Zip 연산자를 사용할 수 있다.
참고
https://amitshekhar.me/blog/long-running-tasks-in-parallel-with-kotlin-flow
728x90