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