Kotlin

[Kotlin] StateFlow subscriptionCount 구독자 수 확인

Darane 2021. 10. 15. 09:45

 

StateFlow는 Hot stream으로 구독 여부와 상관없이 데이터를 발행합니다. 그래서 경우에 따라 비효율적인 동작이 될 수 있습니다.

subscriptionCount로 구독자 수를 확인할 수 있습니다. 구독자 수를 확인하여 데이터 발행 유무를 판단하면 더 효율적인 동작을 만들 수 있습니다.

 

 

Cold Stream과 Hot Stream 차이는 아래 포스팅에서 확인할 수 있습니다.

2021.10.05 - [Kotlin] - [Kotlin] Cold Stream(flow), Hot Stream(flow) 차이점

 

 

아래 예제는 구독자가 있는 경우 onActive()를 호출하고 구독자가 생기면 onInactive()를 호출합니다.

onActive()가 호출 될 경우 데이터 발행을 처리하고 onInactive()가 호출되면 데이터를 발행하지 않으면 됩니다.

sharedFlow.subscriptionCount
    .map { count -> count > 0 } // 구독자 수(count)를 active/inactive로 Mapping합니다.
    .distinctUntilChanged() // true <-> false 변경만 확인
    .onEach { isActive -> // 동작 구성
        if (isActive) onActive() else onInactive()
    }
    .launchIn(scope) // launch it

 

 

예제의 property와 함수별로 살펴보겠습니다.

 

반응형

subscriptionCount

abstract val subscriptionCount: StateFlow<Int>

SharedFlow에 활성화된 구독자(subscribers)의 수를 얻을 수 있습니다.

결과 값은 음수가 아니고 0부터 시작합니다.

 

 

distinctUntilChanged()

fun <T> Flow<T>.distinctUntilChanged(): Flow<T>

값이 변경될 때만 데이터를 생성합니다. 동일한 값이 계속오는 경우에 무시(필터링)합니다.

 

 

onEach()

fun <T> Flow<T>.onEach(action: suspend (T) -> Unit): Flow<T>

구독자에게 데이터를 보내기 전에 지정된 작업하고 Flow를 반환합니다.

 

 

launchIn()

fun <T> Flow<T>.launchIn(scope: CoroutineScope): Job

CoroutinScope에서 지정된 Flow의 컬렉션을 시작하는 Terminal Flow 연산자입니다.

scope.launch { flow.collect() } 의 축약이기도 합니다.

 

 

 

[Kotlin] Type checks와 형변환(casts)

Kotlin callbackFlow callback listener의 데이터를 Coroutines flow로 보내기

[Kotlin] Cold Stream(flow), Hot Stream(flow) 차이점

반응형