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' 카테고리의 다른 글
[Kotlin] Type checks와 형변환(casts) (0) | 2021.10.06 |
---|---|
[Kotlin] Cold Stream(flow), Hot Stream(flow) 차이점 (0) | 2021.10.05 |
Kotlin callbackFlow callback listener의 데이터를 Coroutines flow로 보내기 (0) | 2021.09.13 |
[Kotlin] 기본적인 구문 - 2 (0) | 2021.09.07 |
[Kotlin] 기본적인 구문 - 1 (0) | 2021.09.03 |
Kotlin companion object(동반 객체) (0) | 2020.05.20 |