【问题标题】:RxSwift: Mapping a completable to single observable?RxSwift:将可完成映射到单个可观察?
【发布时间】:2017-05-28 18:36:43
【问题描述】:

我正在尝试使用 RxSwift 依次执行几个操作,但不确定如何使其工作。

问题是返回一个Single observable,其中成功/错误取决于Completable 调用是成功还是失败。

我的代码尝试大致如下:

func doSomething(with value: SomeType) -> Single<SomeType> {
    return repository.replace(with: value) // replace() returns a completable
        .asObservable()
        .flatMap { () -> Single<SomeType> in
            return Single.just(value)
    }
}

第 4 行错误(平面地图):

无法将调用结果类型“Observable<_.e>”转换为预期类型“PrimitiveSequence”(又名“PrimitiveSequence”)

如何将这个可完成映射到单个?

【问题讨论】:

    标签: ios rx-swift


    【解决方案1】:

    我不确定 RxSwift,但在 RxJava 中你可以做到以下几点

    repository.replace(with: value).andThen(Single.just(value))
    

    【讨论】:

      【解决方案2】:

      在我回答这个问题几个月后,Completable 类型中添加了一个新的运算符。 .andThen。使用它使这段代码更简单:

      func doSomething(with value: SomeType) -> Single<SomeType> {
          return repository.replace(with: value)
              .andThen(Single.just(value))
      }
      

      原始答案如下:

      嗯... Completable 永远不会发出元素,因此 flatMap 没有什么可做的。 IE。甚至在 Completable 上使用 flatMap 运算符也没有意义。你唯一能用它做的就是订阅它。

      因此,您需要像这样实现您的方法:

      func doSomething(with value: SomeType) -> Single<SomeType> {
          return Single<SomeType>.create { observer in
              return repository.replace(with: value)
                  .subscribe(onCompleted: {
                      observer(.success(value))
                  }, onError: {
                      observer(.error($0))
                  })
          }
      }
      

      在这些新奇类型之前,我曾尝试使用过去不发出值的 Observable,但我一直觉得它们很痛苦。如果我是你,我会将你的 replace 方法转换为返回 Single&lt;Void&gt; 而不是 Completable。即:

      func replace(with value: SomeType) -> Single<Void> 
      

      如果你这样做,那么你可以简单地:

      func doSomething(with value: SomeType) -> Single<SomeType> {
          return repository.replace(with: value).map { value }
      }
      

      当然,如果你能做到这一点,那么你不妨让replace(with:) 本身返回一个Single&lt;SomeType&gt;

      【讨论】:

      • 谢谢,我想了很多,并按照您的建议实施了它。我会给 Completable 更多的机会,然后进行评估?。
      猜你喜欢
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      相关资源
      最近更新 更多