Я ломаю голову над тем, как это сделать в RX.
T Фактический вариант использования - это отображение LowerLevelEvent (val userId: String) в HigherLevelEvent (val user: User), где Userобеспечивается observable, поэтому он может выдавать n раз, , поэтому пример вывода
LowerLevelEvent1(abc) -> HigherLevelEvent1(userAbc(nameVariation1)
LowerLevelEvent2(abc) -> HigherLevelEvent2(userAbc(nameVariation1)
LowerLevelEvent3(abc) -> HigherLevelEvent3(userAbc(nameVariation1)
LowerLevelEvent4(abc) -> HigherLevelEvent4(userAbc(nameVariation1)
HigherLevelEvent4(userAbc(nameVariation2)
HigherLevelEvent4(userAbc(nameVariation3)
Так что моим наивным решением было использовать объединение результатов.Таким образом, хотя userId не изменяется, пользовательское наблюдаемое подписывается, то есть не повторно подписывается, когда новый lowerLevelEmits и его userId не изменяются.*
Тогда я подумал о
lowerLevelObservable.
.switchMap { lowerLevelEvent ->
userRepository.findByIdObservable(lowerLevelEvent.userId)
.map { user -> createHigherLevelInstance... }
}
Это, однако, может сломаться, если lowerLevelObservable испускает быстро, и, поскольку наблюдаемое пользователем может занять некоторое время, данное событие lowerLevelX может быть пропущено, чего у меня не может быть.Кроме того, он повторно подписывает пользователя, наблюдаемого для каждого выброса, что является расточительным, поскольку он, скорее всего, не изменится
Итак, может быть, concatMap?Это связано с тем, что наблюдаемая пользователем не завершена, поэтому concatMap не будет работать.
У кого-нибудь есть подсказка?
Большое спасибо
// Разъяснение: в основном его отображениеВарианты (A1, A2 ..) к вариантам A '(A1', A2 '..) при присоединении к нему запрашиваемого объекта, где запрос является наблюдаемым, поэтому он может повторно отправляться после создания сопоставления, поэтому AX' необходимополучить новый результат запроса.Но запрос холодный и не завершается
Так пример A1(1) -> A1'(user1), A2(1) -> A2'(user1), A3(1) -> A3'(user1)
- теперь кто-то меняет user1 где-то еще в приложении, поэтому следующий emit - A3'(user1')