Различия между длительной обработкой Flow с помощью Transform() и FlatMapLatest()Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Различия между длительной обработкой Flow с помощью Transform() и FlatMapLatest()

Сообщение Anonymous »

У меня есть поток данных, поступающий с сервера. Сервер не предоставляет никакой информации о том, когда поступит следующий фрагмент данных. В моем репозитории есть Flow, который отправляет данные по мере их поступления. Например, в моей тестовой настройке репозиторий выдает данные каждые 5 секунд, но на самом деле данные могут поступить в любое время, и интервал между выбросами не ограничен:

Код: Выделить всё

class YourRepository {
private var counter = 0

fun dataStream(): Flow = flow {
while (true) {
counter++
val newData = YourDataClass(
info = "Update #$counter",
timestamp = System.currentTimeMillis(),
)
emit(newData)
delay(5.seconds)
}
}
}
Мое требование состоит в том, чтобы при поступлении новых данных мне нужно было показывать загрузчик или счетчик, ждать 2 секунды, а затем отображать данные в режиме реального времени. Я уже придумал два примера реализации кода для преобразования потока репозитория в StateFlow, и я хочу знать, каковы их преимущества и недостатки.
  • Использование FlatMapLatest:

    Код: Выделить всё

    class YourViewModel(
    repository: YourRepository,
    ) : ViewModel() {
    val uiState: StateFlow = repository.dataStream()
    .flatMapLatest { data ->
    flow {
    emit(DataUiState.Updating)
    delay(2.seconds)
    emit(DataUiState.Success(data))
    }
    }
    .stateIn(
    scope = viewModelScope,
    started = SharingStarted.WhileSubscribed(5.seconds),
    initialValue = DataUiState.InitialLoading,
    )
    }
    
  • Использование преобразования:

    Код: Выделить всё

    class YourViewModel(
    repository: YourRepository,
    ioDispatcher: CoroutineDispatcher = Dispatchers.IO,
    ) : ViewModel() {
    val uiState: StateFlow = repository.dataStream()
    .transform { data ->
    emit(DataUiState.Updating)
    delay(2.seconds)
    emit(DataUiState.Success(data))
    }
    .flowOn(ioDispatcher)
    .stateIn(
    scope = viewModelScope,
    started = SharingStarted.WhileSubscribed(5.seconds),
    initialValue = DataUiState.InitialLoading,
    )
    }
    


Подробнее здесь: https://stackoverflow.com/questions/797 ... flatmaplat
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»