Упростите оператор, используя rxkotlin

Я хотел попробовать RxJava с kotlin, чтобы упростить кодирование, поэтому я сделал это:

fun postAnswers() {
    disposable = getToken.execute().subscribe({ token ->
        questions.forEach { form ->
            val answers = form.answers?.filter { it.isChecked }?.map { it.answer_id }
            disposable = postAnswer.execute(token?.token!!, SavedAnswer(form.form_id, answers)).subscribe({
                //Post live data about success
            }, {
                //Post live data failure
            })
        }
    }, {
        //Post live data failure
    })
}

Но у меня такое впечатление, что можно сделать лучше, но я не знаю как. В основном, чего я пытаюсь добиться, это получить объект Token из базы данных, который возвращает Flowable Token? а затем использовать его для вызова postAnswer в цикле for, потому что мне нужно публиковать каждый ответ отдельно (так устроен API). После этого postAnswer возвращает только Completable, но мне нужно сообщить Activity (это из кода ViewModel), сколько ответов было опубликовано

Я думал об использовании функций .flatMap или .concat, но я не уверен, будет ли это полезно в этом случае. Кроме того, нужно ли назначать getToken.execute() одноразовому?

Спасибо за ответ

РЕДАКТИРОВАТЬ:

Вот мой список вопросов:

private var questions: List<Form> = emptyList()

Он заполняется функциями viewModel.


person Lukas Anda    schedule 06.01.2019    source источник
comment
Вы делаете это неправильно, все должно выполняться в одном потоке Rx. Что такое questions объект? Скопируйте сюда свой класс или, по крайней мере, все используемые здесь объекты, чтобы предоставить дополнительную информацию, чтобы помочь вам.   -  person DawidJ    schedule 06.01.2019
comment
@DawidJamroży, извините, вопросы - это просто список объектов, я отредактировал свой вопрос.   -  person Lukas Anda    schedule 06.01.2019


Ответы (1)


Попробуй подумать вложенностью :) Здесь, наверное, сойдет: для каждого сохраненного ответа отправить запрос.

disposable = getToken.execute()
   .switchMap { token ->  // switchMap because your old token is probably invalidated
      val savedAnswers = questions
            .map { form->                
                val formId = form.form_id

                form.answers
                   ?.filter { it.isChecked }
                   ?.map { it.answer_id }
                   ?.let { SavedAnswer(formId, answersIds) }
                   ?: SavedAnswer(formId, emptyList() ) // if no checked answer, then return empty list of ids
            }

      Observable.list(savedAnswers)
            .concatMap { savedAnswer -> // concatMap because you want the whole list to be executed once per time, use flatMap if you want it to be in parallel.
                  postAnswer.execute(token?.token!!, savedAnswer) // FYI: !! is bad practice in Kotlin, try make it less anbiguous
            }
            .toList()
   }
   .subscribe({ listOfResultsFromPostings : List<SomeResultHere> ->
        //Post live data about success
    }, {
        //Post live data failure
    })
person Diolor    schedule 24.01.2019