반응형
Android 코루틴 플로우(Coroutine Flow)에 대해 알아보자
# flow { ... }
public fun <T> flow(@BuilderInterface block: suspend FlowCollector<T>.() -> Unit)
: Flow<T> = SafeFlow(block)
flow {
// 플로우 블럭
}
- 하나의 소비자(Consumer)에게 값을 보냅니다.
- 생성된 이후에 누군가 소비하기 시작하면 데이터를 발행합니다.
# 플로우 기초
# 플로우 연산자 타입
1. 플로우 중간 연산자 (Intermediate flow operators)
- 중간 연산자도 마찬가지로 플로우와 같이 콜드(Cold) 타입으로 동작
- 중간 연산자는 suspend(중단)함수가 아니기에 새롭게 변환된 플로우를 즉시 반환 (지연 x)
- 중간에서 값을 소비하지 않고도 데이터 스트림을 수정할 수 있음
- filter, map ..
2. 변환 연산자 (Transform operator)
- transform 연산자는 중간 연산자(map, filter) 같이 단순한 변환 보다 복잡한 변환을 처리위한 연산자
- 변환 연산자(transform)은 예시처럼 emit()을 추가하여 요소마다 여러개의 변환이 가능
- transform
3. 플로우 종단 연산자 (Terminal flow operator)
- 플로우 수집을 시작하는 종단 함수(대표적으로 collect)
- count, collect, reduce
# 플로우 연산
# 플로우 컨텍스트
- 플로우는 현재 코루틴 컨텍스트에서 호출
# 플로우 버퍼
- 생산자와 소비자가 흐름이 동일한 타이밍에 만들어지고 소비되는 것이 아님 -> 유연한 흐름 필요
- Collect & CollectLastest
# 플로우 결합
# 플로우 플래트닝
# 플로우 예외처리
# 플로우 런칭
public suspend fun Flow<*>.collect(): Unit = collect(NopCollector)
public fun<T>Flow<T>.launchIn(scope: CoroutineScope): Job = scope.launch{
collect() // tail-call
}
- 이벤트를 처리할때는 launchIn을 사용한다.
참조 : 스터디그룹
반응형
'안드로이드 > Android 비동기 처리' 카테고리의 다른 글
[Android] CoroutineScope, CoroutineContext, CoroutineBuilder, suspend Function (0) | 2024.03.20 |
---|---|
[Android] Coroutine StateFlow, Flow, LiveData, ViewModelScope, LifecycleScope + Paging3 (1) | 2024.03.20 |
비동기 처리(process&thread) (0) | 2022.06.07 |
Coroutine suspend function (0) | 2022.04.19 |
CoroutineContext (0) | 2022.04.16 |