RxSwift:链可以完全观察到

时间:2018-06-08 05:25:25

标签: ios swift observable rx-swift

我想将Completable链接到一个可观察元素。在调用 flatMap 之后,onCompleted和onError回调似乎不会在订阅时被调用。

var user = PublishRelay<User>()

func fetchUserInformation(_ userId: String) -> Completable {
    return Completable.create { observer in
        apiService.fetchInformation(for: userId, completion: { response in
            if let name = response?.name {
                user.accept(User(name: name))
                observer(.completed)
            } else {
                observer(.error(ServiceError.userInformation))
            }
        })
        return Disposables.create()
    }
}

login()
.flatMap{ userId in fetchUserInformation(userId) }
.subscribe(
    onCompleted: {
        print("Success!") // Not being called at all
    },
    onError: { error in
        print(error)  // Not being called at all
    }
).disposed(by: disposeBag)

虽然正在调用 fetchUserInformation 观察者(.completed)并且正在成功获取用户信息,但我无法捕获 onCompleted 订阅时(仅在 flatMap 之前)。

有没有一种干净的方法来实现这一目标?

  

flatMap 调用之后已经尝试 .materialized()以获得

    Observable<Event<Never>>
     

而不是

    Observable<Never>
     

它也不起作用。

3 个答案:

答案 0 :(得分:5)

我认为你可以这样做:

login()
    .flatMap{ userId -> Observable<Void> in
        return fetchUserInformation(userId).andThen(.just(Void()))
    }.subscribe(onNext: { _ in
        ...
    }).disposed(by: disposeBag)

答案 1 :(得分:3)

正确的解决方案是使用“ andThen”运算符。

someCompletable
   .andThen(someObservable) 

修改: 只需阅读其余的代码-我完全不确定为什么要使用Completable,因为看来您实际上是从该流中返回了一些元素。

您可能需要使用Single或Plain-ol'观察值来中继该值,而无需使用外部中继。

答案 2 :(得分:0)

据我所知,你不能将Completable转换为Observable,因为后者省略了值,而Completable则没有。

我想flatMap从Login返回Observables然后你将它转换为Completables,这就是它失败的原因