【问题标题】:Editing data in repository pattern using RxJava使用 RxJava 在存储库模式中编辑数据
【发布时间】:2019-11-19 13:21:22
【问题描述】:

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

我想要实现的是编辑用户。为此,我将拥有和 update(user: User) 功能,而使用它的天真的方式是

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

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

注意:我使用的是干净的架构,所以我认为更新每个字段,让我在数据模块中获取用户是不正确的,因为我会订阅数据中的观察者,并且当活动破坏时很难处理

对我来说与When do you use map vs flatMap in RxJava? 的问题不同,因为尽管 flatMap 是回答问题的东西,但它不是同一个问题,所以任何有相同问题/问题但不知道该 flatmap 的人是答案,永远无法使用平面地图。

【问题讨论】:

标签: android kotlin rx-java repository-pattern


【解决方案1】:

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

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

回调解决了 Future.get() 过早阻塞的问题 不允许任何东西阻塞。它们自然是高效的,因为 它们在响应准备好时执行。

但与 Futures 一样,虽然回调很容易与单个 异步执行级别,通过嵌套组合它们成为 笨重。

Flatmap 操作符在这里提供了救援。您可以在下面的链接中查看 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 运算符将单个更新响应展平,该更新响应将由存储库的更新方法返回,并仅将响应传递到下游。上面的代码不仅更易于阅读,而且使您的代码可重用,因为更新逻辑现在是链的一部分。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2011-07-06
    相关资源
    最近更新 更多