Mat*_*oal 4 swift urlsession combine
我正在尝试处理通过读取其响应状态代码而到达的响应DataTaskPublisher。
当状态代码大于 299 时,我想返回一个ServiceError失败类型。在我见过的每个示例中,我都使用过.mapError.......catch在这种特定情况下,从 a .flatMap,我真的不知道如何处理发布者响应以返回错误而不是TResponse......
return URLSession.DataTaskPublisher(request: urlRequest, session: .shared)
.mapError{error in return ServiceError.request}
.flatMap{ data, response -> AnyPublisher<TResponse, ServiceError> in
if let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode){
return Just(data)
.decode(type: TResponse.self, decoder: JSONDecoder())
.mapError{error in return ServiceError.decode}
.eraseToAnyPublisher()
}else{
//???? HOW TO HANDLE THE ERROR?
}
}
.receive(on: RunLoop.main)
.eraseToAnyPublisher()
Run Code Online (Sandbox Code Playgroud)
enum ServiceErrors: Error {
case internalError(_ statusCode: Int)
case serverError(_ statusCode: Int)
}
return URLSession.shared.dataTaskPublisher(for: urlRequest)
.tryMap { data, response in
guard let httpResponse = response as? HTTPURLResponse,
200..<300 ~= httpResponse.statusCode else {
switch (response as! HTTPURLResponse).statusCode {
case (400...499):
throw ServiceErrors.internalError((response as! HTTPURLResponse).statusCode)
default:
throw ServiceErrors.serverError((response as! HTTPURLResponse).statusCode)
}
}
return data
}
.mapError { $0 as! ServiceErrors }
.decode(type: T.self, decoder: JSONDecoder())
.receive(on: RunLoop.main)
.eraseToAnyPublisher()
Run Code Online (Sandbox Code Playgroud)
注意:我依靠此链接来制作我的错误处理程序。
| 归档时间: |
|
| 查看次数: |
3312 次 |
| 最近记录: |