내가 작업하고 있는 프로젝트에서 네트워크 연결, 끊김 상태를 stateFlow로 만들어 상태를 체크하는데 중복 값이 자꾸만 들어오는 것이다.
stateFlow 중복값 방지 된다며! 왜 계속 들어오는 거야??
보니까 내가 만든 stateFlow는 NetworkState라는 데이터 타입인데 그 중 사용하는 isConnected라는 변수외에 다른 변수들 값이 계속해서 바뀌는 바람에 중복 데이터로 인식하지 않고 계속 방출되는 것이었다.
잘못 쓰고 있던 나의 코드 .. natworkState가 끝없이 방출됨.... 나는 그저 isConnected가 변경되었을 때만 알고 싶었을 뿐인데
(근데 니가 애초에 networkState로 받았잖아!!)
viewModelScope.launch{
networkStateUseCase()
.collect { networkState ->
when (networkState.isConnected) {
true -> {
_isNetworkConnected.emit(true)
}
false -> {
_isNetworkConnected.emit(false)
}
}
}
}
이럴 때 쓰는 게 바로 distinctUntilChanged다!
distinctUntilChanged는 연속적으로 동일한 데이터가 방출될 때, 이를 필터링하여 중복 처리를 방지하는 데 사용된다.
stateFlow, distinctUntilChanged 둘 다 중복 값을 방지하지만 가장 큰 차이는 필터링에 있다.
distinctUntilChanged는 필터링하여 중복 처리 방지가 된다.
예시 코드
viewModelScope.launch {
networkStateUseCase()
.distinctUntilChanged { old, new ->
old.isConnected == new.isConnected
}
.collect { networkState ->
when (networkState.isConnected) {
true -> {
_isNetworkConnected.emit(true)
}
false -> {
_isNetworkConnected.emit(false)
}
}
}
}
반응형