【问题标题】:Simplify the statement using rxkotlin使用 rxkotlin 简化语句
【发布时间】:2019-06-01 07:39:33
【问题描述】:

我想用 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 函数填充

【问题讨论】:

  • 你做错了,应该在单个 Rx 流中完成。 questions 对象是什么?在此处复制您的课程或至少复制此处使用的所有对象,以提供更多信息以帮助您。
  • @DawidJamroży 抱歉,问题只是一个简单的对象列表,我已经编辑了我的问题

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


【解决方案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
    })

【讨论】:

    猜你喜欢
    • 2012-03-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多