我創建了這個發布者鏈:
enum ViewState {
case loading, loaded([Person]), error(String)
}
var viewStatePublisher: AnyPublisher<ViewState, Never> {
service.fetchPeople()
.map { ViewState.loaded($0) }
.eraseToAnyPublisher()
}
fetchPeople可能會失敗,我想將其作為一個ViewState.error(String)值沿發布者鏈傳播。這是我想要做的一個粗略的想法:
service.fetchPeople()
.mapError { error -> AnyPublisher<ViewState, Never> in
ViewState.error(error.localizedDescription)
}
.map { ViewState.loaded($0) }
.eraseToAnyPublisher()
但是,mapError不是那樣作業的。我很難找到其他替代方法。
uj5u.com熱心網友回復:
您需要catch將上游發布者拋出的錯誤替換為新的下游發布者。
在 中catch,您可以將錯誤包裝在 a 中Just,它是Publisher立即發出單個值的 a。
service.fetchPeople()
.map { ViewState.loaded($0) }
.catch { Just(ViewState.error($0.localizedDescription)) }
.eraseToAnyPublisher()
uj5u.com熱心網友回復:
將可能出錯的流轉換為可能Never失敗的發布者的方法是使用replaceError. 請參閱我的https://www.aeth.com/UnderstandingCombine/operators/operatorsErrorHandlers/operatorsreplaceerror.html
service.fetchPeople()
.map { ViewState.loaded($0) }
.replaceError { with: ViewState.error("Darn") }
.eraseToAnyPublisher()
這會輸出一個AnyPublisher<ViewState, Never>正是你所追求的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/405339.html
標籤:
