【问题标题】:RxJava Android zip many requests with different typesRxJava Android 压缩许多不同类型的请求
【发布时间】:2015-12-16 16:32:14
【问题描述】:

我对 Observable.zip 函数有点“审美”问题。你可以这样使用它:

Observerbale.zip(
    reqA, reqB, reqC,
    (a, b, c) -> {/*deal with them*/});

请求的数量等于“deal-with-it”函数中的参数数量。现在,如果你有更多的请求,比如 6 个,你最终会得到一个函数,它需要 6 个参数(假设它们都有不同的类型)。就是感觉不干净。有没有办法将它们包装在一个类中,例如属性?

我现在的现实问题是,我使用 zip 来加载设置数据:

Observable.zip(
    loadAPIMenus(),                        //1.
    databaseService.readFavorites(),       //2.
    (menuResponse, favorites) -> loadFavorites(menuResponse, favorites)) //3.
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(
        menus -> menuSubscriber.onNext(menus), //4.
        error -> menuSubscriber.onError(error));
  1. 从 rest api 加载列表视图的项目
  2. 加载这些项目的 ID,这些项目作为收藏夹存储在 db 中
  3. 合并两个列表,因此最喜欢的项目具有 isFavorite >设置为 true
  4. 更新列表视图

现在还不错。但我想在#3 处添加 2-3 个对其他数据结束函数的请求,这将增长到具有太多函数参数的 4 行猛犸象。

我想,我可以使用嵌套的 Observable.zip,但可能很危险。有没有更优雅的方式来包装这些参数?

很高兴看到您的建议。

【问题讨论】:

    标签: java android rx-java rx-android reactivex


    【解决方案1】:

    Observable::zip() 的文档中,它指出:

    “您可以提供要压缩在一起的 Observable,以 2 到 9 个单独的参数进行压缩,或作为单个参数:Observable 的 Iterable 或发出 Observable 的 Observable(如上图所示) )。"

    这为使用某种形式的Iterable<Observable<T>>Observable<Observable<T>> 打开了大门,而不是您现在使用的2-9 Observables 之间的任何重载。

    通过这种方法,zip 的最后一个参数现在也变成了FuncN,它以参数列表Object... args 作为其参数调用,您可以将其视为一个数组。

    如果您使用Observable::zip(Iterable, FuncN) 方法,您可以:

    List<Observable<T>> list = new ArrayList<>();
    list.add(req1);
    list.add(req2);
    
    Observable.zip(list, new FuncN<???>() {
        @Override
        public ??? call(Object... args) {
            return ???;
        }
    );
    

    在您的情况下,我不会打扰Observable&lt;Observable&lt;T&gt;&gt;,因为这需要您首先创建一个可观察的列表或数组以传递给Observable::from(),尽管可能有更好的方法来做到这一点。

    【讨论】:

    • 谢谢博士!这比使用多达九个参数的函数要好得多!
    猜你喜欢
    • 2017-05-07
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    相关资源
    最近更新 更多