2

我对 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,但可能很危险。有没有更优雅的方式来包装这些参数?

我很高兴看到你的建议。

4

1 回答 1

5

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

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

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

使用这种方法,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<Observable<T>>你的情况而烦恼,因为这需要你首先创建一个可观察的列表或数组来传递给Observable::from()它,尽管可能有更好的方法来做到这一点。

于 2015-12-20T22:08:45.850 回答