using a single sync flow instance to reduce memory and risk of concurrent flows

This commit is contained in:
Adam Brown 2022-09-27 19:09:21 +01:00
parent 894592870b
commit 1c37667485
1 changed files with 13 additions and 14 deletions

View File

@ -8,7 +8,6 @@ import app.dapk.st.matrix.sync.internal.SideEffectFlowIterator
import app.dapk.st.matrix.sync.internal.overview.ReducedSyncFilterUseCase import app.dapk.st.matrix.sync.internal.overview.ReducedSyncFilterUseCase
import app.dapk.st.matrix.sync.internal.request.syncRequest import app.dapk.st.matrix.sync.internal.request.syncRequest
import app.dapk.st.matrix.sync.internal.room.SyncSideEffects import app.dapk.st.matrix.sync.internal.room.SyncSideEffects
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.cancellable import kotlinx.coroutines.flow.cancellable
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
@ -25,19 +24,17 @@ internal class SyncUseCase(
private val syncConfig: SyncConfig, private val syncConfig: SyncConfig,
) { ) {
fun sync(): Flow<Unit> { private val _flow = flow {
return flow { val credentials = credentialsStore.credentials()!!
val credentials = credentialsStore.credentials()!! val filterId = filterUseCase.reducedFilter(credentials.userId)
val filterId = filterUseCase.reducedFilter(credentials.userId) with(flowIterator) {
with(flowIterator) { loop<OverviewState>(
loop<OverviewState>( initial = null,
initial = null, onPost = { emit(Unit) },
onPost = { emit(Unit) }, onIteration = { onEachSyncIteration(filterId, credentials, previousState = it) }
onIteration = { onEachSyncIteration(filterId, credentials, previousState = it) } )
) }
} }.cancellable()
}.cancellable()
}
private suspend fun onEachSyncIteration(filterId: SyncService.FilterId, credentials: UserCredentials, previousState: OverviewState?): OverviewState? { private suspend fun onEachSyncIteration(filterId: SyncService.FilterId, credentials: UserCredentials, previousState: OverviewState?): OverviewState? {
val syncToken = syncStore.read(key = SyncStore.SyncKey.Overview) val syncToken = syncStore.read(key = SyncStore.SyncKey.Overview)
@ -85,4 +82,6 @@ internal class SyncUseCase(
) )
} }
fun sync() = _flow
} }