From 6a583b446dc2d140fa95e32eebfdbb9e00387c0b Mon Sep 17 00:00:00 2001 From: Shcherbatykh Oleg Date: Mon, 16 Feb 2026 15:12:25 +0300 Subject: [PATCH] Remove not used emits --- .../tsudesk/core/common/model/DataResult.kt | 12 ++--- .../schedule/data/ScheduleRepositoryImpl.kt | 54 +++++++++---------- .../data/local/ScheduleLocalDataSourceImpl.kt | 2 + 3 files changed, 30 insertions(+), 38 deletions(-) diff --git a/core/common/src/main/java/ru/fincode/tsudesk/core/common/model/DataResult.kt b/core/common/src/main/java/ru/fincode/tsudesk/core/common/model/DataResult.kt index 3bd51b7..b10f5a5 100644 --- a/core/common/src/main/java/ru/fincode/tsudesk/core/common/model/DataResult.kt +++ b/core/common/src/main/java/ru/fincode/tsudesk/core/common/model/DataResult.kt @@ -2,15 +2,9 @@ package ru.fincode.tsudesk.core.common.model sealed interface DataResult { - data class Cache( - val data: T + data class Data( + val data: T, val refreshedFromNetwork: Boolean ) : DataResult - data class Network( - val data: T - ) : DataResult - - data class Error( - val throwable: Throwable - ) : DataResult + data class Error(val throwable: Throwable) : DataResult } diff --git a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/ScheduleRepositoryImpl.kt b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/ScheduleRepositoryImpl.kt index d77b1ac..5fcb1b4 100644 --- a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/ScheduleRepositoryImpl.kt +++ b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/ScheduleRepositoryImpl.kt @@ -1,13 +1,11 @@ package ru.fincode.tsudesk.feature.schedule.data -import android.os.Build -import androidx.annotation.RequiresApi import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch import ru.fincode.tsudesk.core.common.model.DataResult -import ru.fincode.tsudesk.core.common.model.DataResult.Error import ru.fincode.tsudesk.core.network.model.NetworkResult import ru.fincode.tsudesk.core.network.model.map import ru.fincode.tsudesk.feature.schedule.data.datasource.ScheduleLocalDataSource @@ -17,6 +15,7 @@ import ru.fincode.tsudesk.feature.schedule.data.mapper.ScheduleNetworkMapper import ru.fincode.tsudesk.feature.schedule.domain.model.ScheduleEntity import ru.fincode.tsudesk.feature.schedule.domain.model.ScheduleType import ru.fincode.tsudesk.feature.schedule.domain.repository.ScheduleRepository +import java.util.concurrent.atomic.AtomicBoolean import javax.inject.Inject class ScheduleRepositoryImpl @Inject constructor( @@ -25,7 +24,6 @@ class ScheduleRepositoryImpl @Inject constructor( private val mapper: ScheduleNetworkMapper ) : ScheduleRepository { - @RequiresApi(Build.VERSION_CODES.O) override fun observeSchedule(type: ScheduleType): Flow> = channelFlow { val key = when (type) { @@ -33,39 +31,37 @@ class ScheduleRepositoryImpl @Inject constructor( is ScheduleType.Teacher -> ScheduleCacheKey.teacher(type.name) } - // кэш -> UI + // Маркер: "следующий DB-emit считать пришедшим после сети" + val markNextAsNetwork = AtomicBoolean(false) + val cacheJob = launch { local.observeSchedule(key).collect { cached -> - if (cached != null) send(DataResult.Cache(cached)) + if (cached != null) { + val flag = markNextAsNetwork.getAndSet(false) + trySend(DataResult.Data(cached, refreshedFromNetwork = flag)) + } } } - val networkResult: NetworkResult = when (type) { - is ScheduleType.Group -> - remote.loadScheduleByGroup(type.number).map(mapper::invoke) + // refresh: сеть -> БД, без эмита сетевых данных + launch { + val net: NetworkResult = when (type) { + is ScheduleType.Group -> remote.loadScheduleByGroup(type.number) + .map(mapper::invoke) - is ScheduleType.Teacher -> - remote.loadScheduleByTeacher(type.name).map(mapper::invoke) - } - - when (networkResult) { - is NetworkResult.Success -> { - // (опционально) сразу отдать сетевой результат - send(DataResult.Network(networkResult.data)) - - // single source of truth -> сохраняем в БД - local.saveSchedule(key, networkResult.data) - - // дать Room время эмитнуть обновление - kotlinx.coroutines.yield() - - // закрываем поток по твоему требованию - close() + is ScheduleType.Teacher -> remote.loadScheduleByTeacher(type.name) + .map(mapper::invoke) } - is NetworkResult.Error -> { - send(Error(Throwable(networkResult.error.toString()))) - close() + when (net) { + is NetworkResult.Success -> { + local.saveSchedule(key, net.data) // записали + markNextAsNetwork.set(true) // следующий DB emit пометить + } + + is NetworkResult.Error -> { + trySend(DataResult.Error(Throwable(net.error.toString()))) + } } } diff --git a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/local/ScheduleLocalDataSourceImpl.kt b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/local/ScheduleLocalDataSourceImpl.kt index 56da269..d291d54 100644 --- a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/local/ScheduleLocalDataSourceImpl.kt +++ b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/local/ScheduleLocalDataSourceImpl.kt @@ -2,6 +2,7 @@ package ru.fincode.tsudesk.feature.schedule.data.local import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged import ru.fincode.tsudesk.core.database.schedule.ScheduleDao import ru.fincode.tsudesk.feature.schedule.data.datasource.ScheduleLocalDataSource import ru.fincode.tsudesk.feature.schedule.data.mapper.toCache @@ -29,6 +30,7 @@ class ScheduleLocalDataSourceImpl @Inject constructor( .combine(dao.observeLessons(key)) { schedule, lessons -> schedule?.toDomain(lessons) } + .distinctUntilChanged() } override suspend fun removeSchedule(key: String) {