使用 RxJava 在存储库模式中编辑数据

Editing data in repository pattern using RxJava

我正在使用 RxJava 重构我的存储库的实现,所以我想知道一些编辑方法,例如,一个用户。 我的 getUser(email: String),以电子邮件作为 id,返回一个可观察对象,在存储库实现中,我从数据库或服务器获取数据,现在一切都很好。

我想实现的是编辑一个用户。为此,我将拥有和更新(用户:用户)功能,并且使用它的天真方式是

userRepository.getUser(email)
   .subscribeOn(Schedulers.io())
   .subscribe { user ->
      user.name = "antoher name"
      userRepository.update(user)
         .subscribeOn(Schedulers.io())
         .subscribe {
             //handle response
         }
    }

有没有办法避免在观察者内部调用观察者的这种类型?它对我来说不是很可读,我想有更好的方法,但我不明白。

注意:我使用的是干净的架构,所以我认为对每个字段进行更新,让我在数据模块中获取用户是不正确的,因为我会订阅数据中的观察者,并且当activity 摧毁

对我来说这不是同一个问题 When do you use map vs flatMap in RxJava? 因为尽管 flatMap 是回答问题的东西,但它不是同一个问题,所以任何有相同 problem/question 但不知道 flatmap 是答案,永远不会达到使用 flatmap 的目的。

使用 RxJava 的一个优点是您可以根据需要链接任意数量的异步操作(在您的情况下 return Observable 或 Single,存储库方法的方法)而不会陷入回调地狱。您在代码中看到有嵌套的订阅块。如果您必须链接更多异步网络操作怎么办?您陷入回调地狱,代码将变得更难遵循和维护。

移除嵌套回调并使代码更具功能性、组合性和可读性是 RxJava 真正擅长的一件事。在 ReactiveX 网站的介绍部分,他们在 ReactiveX 网站的介绍部分提到了这一点 (http://reactivex.io/intro.html)。

Callbacks solve the problem of premature blocking on Future.get() by not allowing anything to block. They are naturally efficient because they execute when the response is ready.

But as with Futures, while callbacks are easy to use with a single level of asynchronous execution, with nested composition they become unwieldy.

Flatmap 运算符可以解决这个问题。您可以在下面的 link 中查看 flatMap 运算符的定义。

http://reactivex.io/documentation/operators/flatmap.html

下面是我将在您的案例中使用的代码。

userRepository.getUser(email)
   .subscribeOn(Schedulers.io())
   .map { user -> user.name = "another name"; return user; }
   .flatMap { user -> userRepository.update(user) }
   .doOnSuccess { /* handle response here */ } // doOnNext if you are using observable
   .subscribe({ /* or handle response here */ }, { /* must handle error here */})

Flatmap 运算符将单个更新响应展平,这将由您的存储库的更新方法 returned 并仅将响应传递到下游。上面的代码不仅更易于阅读,而且使您的代码可重用,因为更新逻辑现在是链的一部分。

区分 map 和 flatMap 对于充分利用 RxJava 的优势非常重要,因此习惯它会非常有益!