Remove not used emits

This commit is contained in:
2026-02-16 15:12:25 +03:00
parent 9ca225db94
commit 6a583b446d
3 changed files with 30 additions and 38 deletions

View File

@@ -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<DataResult<ScheduleEntity>> =
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<ScheduleEntity> = when (type) {
is ScheduleType.Group ->
remote.loadScheduleByGroup(type.number).map(mapper::invoke)
// refresh: сеть -> БД, без эмита сетевых данных
launch {
val net: NetworkResult<ScheduleEntity> = 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())))
}
}
}

View File

@@ -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) {