Flow란?
Flow
- 비동기적으로 계산되는 데이터의 흐름
- flow(), flowOf(), Collection#asFlow() 등의 Builder을 통해 생성한다.
동작 원리
- Flow 빌더 함수는 FlowCollector 컨텍스트를 제공한다.
fun <T> flow( block: suspend FlowCollector<T>.() -> Unit ): Flow<T>
- Flow.collect()를 호출하면 FlowCollector 객체를 생성한다.
interface Flow<out T> { suspend fun collect(collector: FlowCollector<T>) } suspend inline fun <T> Flow<T>.collect(crossinline action: suspend (value: T) -> Unit): Unit = collect(object: FlowCollector<T> { override suspend fun emit(value: T) = action(value) })
- Flow 빌더 함수에서 emit()을 호출하면 collect()를 통해 전달된 람다 함수가 실행된다.
Ex
// 아래의 두 코드는 같은 코드이다.
// 1
val myFlow = flow {
emit(1)
emit(2)
}
myFlow.collect {
println(it)
}
// 2
println(1)
println(2)