본문 바로가기

flow

[코루틴-Flow] StateFlow (상태플로우) StateFlow (상태플로우)상태플로우는 Hot flow이며 공유플로우의 개념을 확장replay가 1인 공유플로우와 비슷하게 동작접근 가능한 값 하나(value)를 가지고 있다초기값은 생성자로 전달안드로이드에서 LiveData를 대체하는 최신 방식public interface StateFlow : SharedFlow { // 현재 value public val value: T}public fun MutableStateFlow(value: T): MutableStateFlow = StateFlowImpl(value ?: NULL)// StateFlow, MutableSharedFlow 구현public interface MutableStateFlow : StateFlow, Mutable.. 더보기
[코루틴-Flow] SharedFlow (공유플로우) SharedFlow여러 구독자에게 값을 브로드캐스팅하는 데 사용되는 Hot Flow 일반적인 Flow는 Cold Data라 요청 시 값이 계산되지만SharedFlow는 여러 수신자가 동시에 값을 수집할 수 있다// Read-onlypublic interface SharedFlow : Flow { // 현재 replay 버퍼에 저장된 값들의 스냅샷 public val replayCache: List // 절대 완료되지 않는다, 취소되거나 예외가 발생하지 않는 한 영원히 실행 override suspend fun collect(collector: FlowCollector): Nothing}  MutableSharedFlowBroadcast Channel과 비슷replay는 마지막으로 전.. 더보기
[코루틴 - flow] Flow 처리 (중간 연산자) Flow 처리 (Flow Processing)Flow 생성과 최종 연산 사이의 연산 플로우 처리를 위해 사용하는 함수들변환 연산자, 필터링 연산자, 결합 연산자, 컬렉션 연산자 등등..  변환 연산자maptransform 사용 / 항상 하나의 값만 emitpublic inline fun Flow.map( crossinline transform: suspend (value: T) -> R): Flow = transform { value -> return@transform emit(transform(value))} 사용 예시suspend fun main() { flowOf(1, 2, 3) .map { it * it } .collect { print(it) }}// .. 더보기
[코루틴-Flow] 생명주기 함수, empty, catch, flowOn, launchIn Flow는요청이 한쪽 방향으로 흐르고 요청에 의해 생성된 값이 다른 방향으로 흐르는 파이프 Flow의 확장함수를 통해 특정 이벤트를 감지할 수 있다 대표적인 Flow의 생명주기 함수는onEach, onStart, onCompletion 등이 있다. onEachFlow의 값을 하나씩 받기 위해 사용upstream flow의 각 값이 downstream으로 emit되기 전에 지정된 작업을 수행하는 연산자public fun Flow.onEach(action: suspend (T) -> Unit): Flow = transform { value -> action(value) return@transform emit(value)} 사용 예시suspend fun main0() { flowOf(1, 2.. 더보기
[코루틴] Flow 생성 Flow를 시작하는 방법flowOf 사용public fun flowOf(vararg elements: T): Flow = flow { for (element in elements) { emit(element) }}suspend fun main() { flowOf(1, 2, 3, 4, 5) .collect { print(it) }}// 12345  emptyFlow 사용값이 없는 플로우public fun emptyFlow(): Flow = EmptyFlowprivate object EmptyFlow : Flow { override suspend fun collect(collector: FlowCollector) = Unit}suspend fun main().. 더보기
[코루틴] Flow 원리 실제 Flow 구현 코드제네릭 타입 TFlowCollector 리시버 suspend 람다 파라미터Flow 반환safeFlow 생성 public fun flow( @BuilderInference block: suspend FlowCollector.() -> Unit): Flow = SafeFlow(block)private class SafeFlow( private val block: suspend FlowCollector.() -> Unit) : AbstractFlow() { override suspend fun collectSafely(collector: FlowCollector) { collector.block() }} SafeFlow 클래스AbstractFlow 상.. 더보기
[코루틴] Flow란 - (1) Flow(플로우)코루틴을 기반으로 동작하는 코틀린의 비동기 스트림을 다루기 위한 API순차적으로 값을 방출Cold Stream으로 collect 함수 호출 시 데이터 발행  Flow 인터페이스/*** 값을 순차적으로 내보내고 정상적으로 또는 예외와 함께 완료되는 비동기 데이터 스트림*/public interface Flow { // Flow의 값을 수집하는 함수 // 일시중단 함수로 코루틴 내에서 실행되어야 한다 public suspend fun collect(collector: FlowCollector)}   List vs Sequence vs FlowList모든 원소의 계산이 완료된 Collection작은 데이터 크기에 적합// 한 번에 모든 값을 만드는 Listfun allUser.. 더보기
[코루틴] 핫 데이터와 콜드 데이터 크게 2가지 데이터 소스핫 스트림 데이터 (Hot Stream Data)콜드 스트림 데이터 (Cold Stream Data)  핫 스트림 데이터 (Hot Stream Data)구독자의 유무와 상관없이 데이터 발행즉, 데이터의 소비가 없어도 데이터를 생성List, Set, Channel 등 Channel기본적으로 채널은 Hot Stream// 구독자가 없는 Channel을 사용한 예시// 1. Channel (Hot)suspend fun main(): Unit = coroutineScope { val rendezvousChannel = Channel() launch { // Buffer = 0이고 trySend라 큐에 저장되지 않고 바로 실패 반환, non-blocking .. 더보기