В своем приложении для Android я получаю данные из Room и показываю их на картах. Я столкнулся с этими двумя подходами к выборке данных с помощью модели представления.
Какой из них более эффективный и хороший?
В настоящее время я извлекаю данные. со вторым подходом. Он работает нормально. Просто интересно, в чем разница между этими двумя.
Первый подход:
private val _visibleRegion = MutableStateFlow(defaultVisibleRegion)
private val _zoomLevel = MutableStateFlow(6f)
private val _isFavorite = MutableStateFlow(false)
val mapData: StateFlow
> = combine(
_visibleRegion,
_zoomLevel,
_isFavorite
) { region, zoom, isFav ->
Triple(region, zoom, isFav)
}.flatMapLatest { (region, zoom, isFav) ->
repo.getDataInBoundsPaged(
region.southwest.latitude,
region.northeast.latitude,
region.southwest.longitude,
region.northeast.longitude,
zoom = zoom,
isFav = isFav
)
}.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = PagingData.empty()
)
fun updateVisibleRegion(region: LatLngBounds) {
_visibleRegion.value = region
}
fun updateZoomLevel(zoom: Float) {
_zoomLevel.value = zoom
}
fun toggleFavorite(isFavorite: Boolean) {
_isFavorite.value = isFavorite
}
против
Второй подход:
private val _mapData = MutableStateFlow(PagingData.empty())
val mapData: StateFlow = _mapData.asStateFlow()
private val defaultVisibleRegion = LatLngBounds(
LatLng(6.792525080049721, 70.06730787456036),
LatLng(37.411989227903604, 86.94231156259775)
)
init {
fetchMapData()
}
fun fetchMapData(
visibleRegion: LatLngBounds = defaultVisibleRegion,
zoomLevel: Float = 6f,
isFavorite: Boolean = false
) {
viewModelScope.launch {
repo.getDataInBoundsPaged(
visibleRegion.southwest.latitude,
visibleRegion.northeast.latitude,
visibleRegion.southwest.longitude,
visibleRegion.northeast.longitude,
zoom = zoomLevel,
isFav = isFavorite
)
.cachedIn(viewModelScope)
.collect {
_mapData.value = it
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... view-model