Swift联合收割机处理HTTP状态代码错误
我在读这篇文章:关于RayWenderlich如何使用combine。他们有一个例子,它从API获取数据,但不处理HTTP状态码。我想添加它,但到目前为止,我无法这样做 根据这个答案,您可以添加一个Swift联合收割机处理HTTP状态代码错误,swift,combine,Swift,Combine,我在读这篇文章:关于RayWenderlich如何使用combine。他们有一个例子,它从API获取数据,但不处理HTTP状态码。我想添加它,但到目前为止,我无法这样做 根据这个答案,您可以添加一个tryMap,但是XCode开始显示错误,例如:无法推断通用参数“T” 代码如下: 扩展WeatherFetcher:WeatherFetchable{ func每周天气预报( 城市:字符串 )->任何出版商{ 退货预测(带:MakeWeeklyForecast组件(带城市:城市)) } 私人func
tryMap
,但是XCode开始显示错误,例如:无法推断通用参数“T”
代码如下:
扩展WeatherFetcher:WeatherFetchable{
func每周天气预报(
城市:字符串
)->任何出版商{
退货预测(带:MakeWeeklyForecast组件(带城市:城市))
}
私人func预测(
带组件:URLComponents
)->AnyPublisher,其中T:可解码{
guard let url=components.url else{
let error=WeatherError.network(说明:“无法创建URL”)
返回失败(错误:error).eraseToAnyPublisher()
}
return session.dataTaskPublisher(用于:URLRequest(url:url))
.mapError{中的错误
.network(描述:error.localizedDescription)
}
.flatMap(maxpublisher:.max(1)){pair in
解码(成对数据)
}
.删除任何发布者()
}
}
我想补充一点
.tryMap{数据,在中响应
guard let httpResponse=响应为?HTTPURLResponse,
200.我认为您可以简单地用tryMap
替换flatMap
块。不从tryMap
返回数据,它应该被解码。因此返回数据
行应该是返回try JSONDecoder()。解码(T.self,from:data)
private func forecast(带组件:URLComponents)->AnyPublisher其中T:Decodable{
guard let url=components.url else{
let error=WeatherError.network(说明:“无法创建URL”)
返回失败(错误:error).eraseToAnyPublisher()
}
return session.dataTaskPublisher(用于:URLRequest(url:url))
.tryMap{数据,以
guard let httpResponse=响应为?HTTPURLResponse,
200..
private func forecast<T>(with components: URLComponents) -> AnyPublisher<T, WeatherError> where T: Decodable {
guard let url = components.url else {
let error = WeatherError.network(description: "Couldn't create URL")
return Fail(error: error).eraseToAnyPublisher()
}
return session.dataTaskPublisher(for: URLRequest(url: url))
.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 try JSONDecoder().decode(T.self, from: data)
}
.mapError { error in
WeatherError() // some kind of error
}
.eraseToAnyPublisher()