我想将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>
它也不起作用。
答案 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,这就是它失败的原因