使用rxkotlin简化语句

时间:2019-01-06 11:01:10

标签: kotlin retrofit rx-java android-room rx-kotlin

我想在Kotlin中尝试RxJava,以使编码更容易,所以我制作了这个代码:

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?然后用它在for周期中调用postAnswer,因为我需要分别发布每个答案(这就是API的设计方式)。在那之后,postAnswer只返回Completable,但是我需要让Activity知道(这是从ViewModel代码获得的)

我已经考虑过使用.flatMap或.concat函数,但不确定在这种情况下是否会有所帮助。另外,我是否需要将getToken.execute()分配给一次性对象?

谢谢您的回答

编辑:

这是我的问题清单:

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

它被viewModel函数填充

1 个答案:

答案 0 :(得分: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
    })