我对Observable.zip函数有点"estetic"问题.你这样使用它:
Observerbale.zip( reqA, reqB, reqC, (a, b, c) -> {/*deal with them*/});
请求数量等于"处理它"功能中的参数数量.现在,如果你有更多的请求,比如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));
从rest api加载列表视图的项目
加载这些项目的ID,这些项目在db中存储为收藏夹
合并两个列表,因此最喜欢的项目是isFavorite>设置为true
更新列表视图
现在不是那么糟糕.但我想在#3处增加2-3个对其他数据结束函数的请求将增长到具有太多函数参数的4行猛犸象.
我想,我可以使用Observable.zip嵌套在另一个中,但可能很危险.有没有更优雅的方式来包裹这些参数?
我很高兴看到你的建议.
在文档中Observable::zip()
,它指出:
"你可以将Observables压缩在一起,将其压缩为2到9个单独的参数,或者作为单个参数:可观察的可观察对象或发出可观察对象的观察者(如上图所示). "
这打开了使用某种形式的大门Iterable
,或者Observable
代替Observable
你现在使用的2-9 秒之间的重载.
使用这种方法,zip
现在也变为最后一个参数FuncN
,使用参数列表Object... args
作为参数调用,您可以将其视为数组.
如果您使用该Observable::zip(Iterable, FuncN)
方法,您可以:
List> list = new ArrayList<>(); list.add(req1); list.add(req2); Observable.zip(list, new FuncN??>() { @Override public ??? call(Object... args) { return ???; } );
我不打扰Observable
你的情况,因为这需要你创建一个可观察的列表或数组,以便首先传递给Observable::from()
它,尽管可能有更好的方法来做到这一点.