我有两个FLowable对象。 当所有代码都用完时,我需要执行一些代码。 此外,当任何Flowables更新时,我需要执行代码。 我不需要执行任何map函数(不需要它们)。
我尝试使用下面的类似代码
我认为这样做是非常错误的
Flowable<User> user = mDataRepo.getUser();
Flowable<Goal> goal = mDataRepo.getGoal();
Disposable userDisposable = user
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(user -> {
Disposable goalDisposable = goal
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(goal -> {
// do my things with user and goal
}, Throwable::printStackTrace);
mDisposable.add(goalDisposable);
}, Throwable::printStackTrace);
mDisposable.add(userDisposable);
以下是非Rx的示例
mData.getUser(new AppDataSourceOld.GetUserCallback() {
@Override
public void onUserLoaded(@NonNull User user) {
mData.getActiveGoal(new AppDataSourceOld.GetGoalCallback() {
@Override
public void onLoaded(@Nullable Goal goal) {
// do my things with user and goal
}
});
}
});
已编辑:
受@akarnokd启发的解决方案
Flowable<User> user = mDataRepo.getUser();
Flowable<Goal> goal = mDataRepo.getGoal();
user.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.zipWith(goal, new BiFunction<User, Goal, Object>() {
@Override
public Object apply(User user, Goal goal) throws Exception {
// do my things with user and goal
return 1;
}
})
.subscribe();
这看起来更好。但!我需要退货。因为zipWith()
的结果不能为null,如果为空-我收到java.lang.NullPointerException: The zipper returned a null value
所以,这对我来说似乎并不理想,我想我缺少了一些东西。
答案 0 :(得分:0)
实际上,我认为您需要使用func setRoundness(ToCorners corners: UIRectCorner, for view: UIView, withRadius radius: CGFloat) {
let path = UIBezierPath(roundedRect: view.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
view.layer.mask = mask
}
而不是Flowable.combineLatest()
。由于zip不合适,您要求“另外,当Flowables中的任何一个更新时,我需要执行代码”。
所以你会得到类似的东西:
.zip