.materialize()
不
一种可以观察到的错误。当一个可观察对象发出错误时,它就完成了,而materialize仅仅将该错误转换为下一个事件。
你需要把它具体化
第一个flatMapLatest用于防止错误转义flatMap闭包。
此视频可能会有所帮助(注意
selectMany
与
flatMap
)
https://channel9.msdn.com/Blogs/J.Van.Gogh/Reactive-Extensions-API-in-depth-SelectMany?term=select%20many&lang-en=true
let registerRequest = didTapJoinButton.withLatestFrom(text.asObservable())
.flatMapLatest { text in
provider.rx.request(API.register(text: text))
.materialize()
}
.map { (event) -> Event<Response> in
switch event {
case .next(let response) where response.statusCode.isNotFoundStatus():
return Event.error(MyError.notFound)
case .next(let response) where response.statusCode.isSuccessStatus() == false:
return Event.error(MyError.unknown)
default:
return event
}
}
.share(replay: 1)
我搬家了
materialize()
它所属的位置,这样错误就不会打破链条。我也换掉了第二个
flatMapLatest
简单来说
map
因为没有必要做额外的工作。
switch event {
case .next(let response):
let statusCode = response.statusCode
if statusCode.isNotFoundStatus() {
return Event.error(MyError.notFound)
}
else if statusCode.isSuccessStatus() {
return event
}
else {
return Event.error(MyError.unknown)
}
default:
return event
}
但我认为我这样做更干净,因为它减少了闭包的圈复杂度。
以下是处理评论中提出的问题的代码:
extension ObservableType {
func flatMapLatestT<T, U>(_ selector: @escaping (T) -> Observable<U>) -> Observable<Event<U>>
where Self.E == Event<T>
{
return self.flatMapLatest { (event) -> Observable<Event<U>> in
switch event {
case .next(let element):
return selector(element).materialize()
case .completed:
return .just(Event<U>.completed)
case .error(let error):
return .just(Event<U>.error(error))
}
}
}
}
https://gist.github.com/dtartaglia/d7b8d5c63cf0c91b85b629a419b98d7e