Заполнить некоторый список, прежде чем возвращать его с помощью RX

#android #kotlin #system.reactive

#Android #kotlin #system.reactive

Вопрос:

Я пытаюсь заполнить список подробной информацией об аэропорту. Во-первых, я получаю список аэропортов, которые выполняют определенное условие, и получаю подробную информацию о каждом элементе, который есть в списке. И, наконец, я возвращаю заполненный список.

Вот что у меня есть:

 override fun createObservable(params: String): Flowable<List<AirportsEntity>> {
        val destinationAirports = mutableSetOf<AirportsEntity>()
        return this.searchFlightRepository.getDestinationsByCode(params)
            .flatMap {
                Flowable.fromIterable(it)
            }
            .flatMap {
                this.searchFlightRepository.getAirportByCode(it.destination)
            }
            .flatMap {
                destinationAirports.add(it)
                Flowable.just(destinationAirports.toList())
            }
    }
  

Приведенный выше код работает просто отлично, но он выдает наблюдаемое значение для каждого элемента внутри списка. Интересно, как его изменить, чтобы сначала заполнить список, а затем вернуть его, когда процесс выборки будет завершен.

Заранее спасибо.

Комментарии:

1. Удалось ли вам в конце концов заставить это работать?

2. @lain Нет, у меня это не сработало. Это не повторение списка. Я не знаю, что я делаю не так. Я изменил его на ваше решение и не сработал.

3. Я сделал правильный ответ. Если у вас возникнут дополнительные проблемы, возможно, вы могли бы предоставить мне исходный код.

Ответ №1:

Flowable Необходимо ли использовать?

Что-то вроде этого, вероятно, было бы более подходящим:

     private val destinations = listOf("1", "2", "3", "4")

    fun getAirportDestinations(airportCode: String): Single<List<String>> =
            Observable.just(destinations)
                    .flatMapIterable { it }
                    .flatMapSingle { getAirportByCode(it) }
                    .toList()

    private fun getAirportByCode(destinationCode: String): Single<String> =
            Single.just("ABC1")
  

«он выдает наблюдаемый для каждого элемента внутри списка» — flatmap будет выдавать для каждого элемента. Использование toList() будет означать, что оно «возвращает единицу, которая выдает один элемент, список, состоящий из всех элементов, отправленных конечным источником ObservableSource».

Комментарии:

1. Это сработало как шарм. Поток выдавал некоторые ошибки, но мне удалось их исправить, и это решение было единственным. Спасибо!