【问题标题】:Fetching a Single<List> for all elements of another Single<List> in RxKotlin在 RxKotlin 中为另一个 Single<List> 的所有元素获取一个 Single<List>
【发布时间】:2019-10-21 19:07:28
【问题描述】:

A、B、C 是对象

所有函数调用都对房间数据库进行

这段代码 sn-p 在 ViewModel 中

repo = 存储库

所以我正在制作一个 android 应用(无法提供详细信息),对于特定屏幕,我需要执行以下操作。

我的第一个调用是repo.getInfo,它返回一个Single Observable ListOfA:Single&lt;List&lt;A&gt;&gt; //执行一些操作

对于 ListOfA 的每个元素,我需要调用另一个函数 repo.getB(A),它返回一个可观察的 ListOfB:Single&lt;List&lt;B&gt;&gt; //执行一些操作

对于 ListOfB 的每个元素,我需要调用另一个函数 repo.getC(B),它返回一个可观察的 ListOfC:Single&lt;List&lt;C&gt;&gt; //执行一些操作

获得所需数据后,我需要调用另一个函数来组合数据以在 UI 上显示。

现在我无法让它工作。这是我尝试过的。但是流程在标记为 THIS LINE 的行处停止并跳转到订阅块。 对函数的单独调用有效,因此数据不是问题。 我对此很陌生,坦率地说,我的深度不够。任何帮助或提示表示赞赏。谢谢

localListOfA = emptyList<A>()
localListOfB = emptyList<B>()
localListOfC = emptyList<C>()
compositeDisposable.add(
    getInfo.map{listOfA ->
        localListOfA.addAll(listofA)
        listOfA.map {elementA ->   ////THIS LINE
            getB(elementA.id).map{listOfB ->
                listOfB.filter {
                    //some logic to select a few objects
                }
            }.map { it // filtered list of B
                localListofB.addAll(it)
                localListOfB.last() //I only need the top element of this list
            }.map{elementB ->
                getC(elementB.id).map{ listOfC ->
                    localListOfC.addAll(listOfC)
                    //do some operations
                }
            }
        }
    }
    .subscribeOn(DEFAULT_CACHED_SCHEDULERS)
    .observeOn(AndroidSchedulers.mainThread())
    .doOnError(/*take log*/)
    .subscribe{
        prepareUi()
    }
)

【问题讨论】:

    标签: android rx-java reactive-programming rx-kotlin


    【解决方案1】:

    您可以使用.flattenAsObservableList 展平为Observable

    getInfo // Single<List<A>>
        .doOnSuccess { localListOfA.addAll(it) } // Side effect, adding to localListOfA
        .flattenAsObservable { it } // Observable<A>
        .flatMapSingle { elementA -> getB(elementA.id) } // Observable<List<B>>
        .map { it.filter { true } } // Some logic to select a few objects from B
        .doOnNext { localListOfB.addAll(it) } // Side effect, adding to localListOfB
        .map { it.last() } // Observable<B>, only the last element
        .flatMapSingle { elementB -> getC(elementB.id) } // Observable<List<C>>
        .doOnNext { localListOfC.addAll(it) } // Side effect, adding to localListOfC
        .flatMapIterable { it } // Observable<C>
    

    现在,您提到您需要以某种方式组合这些数据。在 Rx 中,您可以嵌套链以访问中间数据。例如,如果您有一个返回 Single&lt;Foo&gt; 的调用,并且您需要 Foo 用于函数 getBar(foo: Foo): Single&lt;Bar&gt;,则实现此目的的一种方法如下:

    getFoo().flatMap { foo -> // .concatMap, .switchMap
        getBar(foo).map { bar ->
            // Use both foo and bar
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多