rxJava:仅在消耗所有Flowable的情况下运行代码

时间:2019-02-04 10:33:59

标签: rx-java

我有两个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

所以,这对我来说似乎并不理想,我想我缺少了一些东西。

1 个答案:

答案 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