- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力从 URLSession 的 ApiErrorResponse
形成一个强类型错误对象(我下面示例中的 .dataTaskPublisher(for:)
对象)出版商,但找不到线索。在这里,我创建了一个从远程 API 获取笑话对象的类,然后我按如下方式处理结果和错误(该类可以按 Xcode Playgrounds 中的原样编译):
class DadJokes {
struct Joke: Codable {
let id: String
let joke: String
}
enum Error: Swift.Error {
case network
case parsing(apiResponse: ApiErrorResponse)
case unknown(urlResponse: URLResponse)
}
struct ApiErrorResponse: Codable {
let code: Int
let message: String
}
func getJoke(id: String) -> AnyPublisher<Joke, Error> {
let url = URL(string: "https://myJokes.com/\(id)")!
var request = URLRequest(url: url)
request.allHTTPHeaderFields = ["Accept": "application/json"]
return URLSession.shared
.dataTaskPublisher(for: request)
.map(\.data)
.decode(type: Joke.self, decoder: JSONDecoder())
.mapError { error -> DadJokes.Error in
switch error {
case is DecodingError:
//(1) <--- here I want to get the URLResponse.data from the upstream dataTaskPublisher to decode an object of type ApiErrorResponse (which is returned by the remote API) and pass it to the parsing error case
return .parsing(apiResponse: ApiErrorResponse(code: 1, message: "test"))
case is URLError:
return .network
default:
//(2) <---- here I want to get the URLResponse object that is emitted from the upstream dataTaskPublisher and pass it to the .unknown error case
// I need the URLResponse to read the underlying error info for debugging purposes
return .unknown(urlResponse: URLResponse())
}
}
.eraseToAnyPublisher()
}
}
我有三个问题,其中两个在上面的代码中有注释。第三个是:我应该怎么做才能从 getJoke
返回一个永不失败的发布者?功能 ?即我需要函数的返回类型为 AnyPublisher<Result<Joke, Error>, Never>
最佳答案
首先,我建议稍微修改错误枚举以将 URLError 添加到 .network
案例中。否则,您无法记录有关网络级错误的信息。 (但这并不真正影响答案的其余部分。)
enum Error: Swift.Error {
case network(URLError)
case parsing(apiResponse: ApiErrorResponse)
case unknown(URLResponse)
}
对于核心问题,如果你想要 URLResponse,那么你不能通过调用 .map(\.data)
这么快就把它扔掉。您需要保留它,直到您决定是否需要它。
您还需要考虑来自 API 的数据未解码为 Joke 或 ApiErrorResponse 等情况。这是可能的,您必须处理它。
由于这变得有点复杂,最好留下基本的 .decode
并直接在您自己的 .map
中处理这些情况:
return URLSession.shared
.dataTaskPublisher(for: request)
.map { (data, response) -> Result<Joke, Error> in
// Either decode a Joke
if let joke = try? JSONDecoder().decode(Joke.self, from: data) {
return .success(joke)
}
// or if that fails, try to decode an error
else if let apiResponse = try? JSONDecoder().decode(ApiErrorResponse.self, from: data) {
return .failure(.parsing(apiResponse: apiResponse))
}
// Wasn't either of those; return the whole response
else {
return .failure(.unknown(response))
}
}
.catch { Just(.failure(.network($0))) } // And also catch errors from dataTaskPublisher
.eraseToAnyPublisher()
关于iOS 组合 : get a strongly typed error from URLSession's dataTaskPublisher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62986052/
如何模拟 URLSession.DataTaskPublisher?我有一个类 Proxy 需要注入(inject)一个 URLSessionProtocol protocol URLSessionP
在下面的代码中,应用程序对象数组用于创建发布者数组,这些发布者数组被合并到发布对象数组中。 apps.map { latestRelease(app: $0) }.merge() 这是最新版本的完成方
在 Xcode 11 beta 5 或 6 中,我现有的代码依赖于 URLSession.DataTaskPublisher停止工作。好像DataTaskPublisher从不发布任何值,但我不知道为
之前 URLSession.shared.dataTask(for request: URLRequest) { data, error, response in ... } data 字段以及其他字
我想从 REST API 获取数据,为此,我需要先获取 ID 数组 - 第一次调用。之后,我需要使用每个 ID 进行 API 调用。我不想使用 completionHandlers,而是使用 Comb
我最近遇到了两个数据获取(下载)API,它们对我来说似乎是一样的。我不知道什么时候应该使用一个而不是另一个。 我可以用 URLSession.shared.dataTask var tasks
如何转换 URLSession.DataTaskPublisher至 Future在组合框架中。 在我看来, Future 发布者在这里更合适,因为调用只能发出一个响应并最终失败。 在 RxSwift
我有一个简单的问题,我只能在documentation中看到dataTaskPublisher我可以通过它调用 get web 服务,但是如何调用可以返回发布者的 post web 服务呢? 最佳答案
我正在努力从 URLSession 的 ApiErrorResponse 形成一个强类型错误对象(我下面示例中的 .dataTaskPublisher(for:) 对象)出版商,但找不到线索。在这里,
尝试发出网络请求时,出现错误 finished with error [-999] Error Domain=NSURLErrorDomain Code=-999 "cancelled" 如果我使用
尝试发出网络请求时,出现错误 finished with error [-999] Error Domain=NSURLErrorDomain Code=-999 "cancelled" 如果我使用
将我们的 API 客户端切换到组合后,我们开始收到用户关于错误“操作无法完成 (NSURLErrorDomain -1.)”的报告,即 error.localizedDescription从我们的 A
我是一名优秀的程序员,十分优秀!