【问题标题】:If dataTaskPublisher has non-nil data, what is the error type then?如果 dataTaskPublisher 有非零数据,那么错误类型是什么?
【发布时间】:2019-11-12 00:09:13
【问题描述】:

之前与

URLSession.shared.dataTask(for request: URLRequest) { data, error, response in ... }

data 字段以及其他字段可能为零。现在有了Combine的

URLSession.shared.dataTaskPublisher(for: urlRequest)

(数据,响应)元组不再是可选类型。我意识到这意味着我们必须将它作为一个 URLError,我们可以在 sink(receiveCompletion: { ... } 中捕获它,但是我如何区分无数据和任何其他错误呢?

【问题讨论】:

    标签: ios swift networking combine


    【解决方案1】:

    服务器返回的任何数据都将转换为来自 dataTaskPublisher 的“响应”对象。在将该数据放入.assign().sink() 订阅者之前,您通常使用的模式主要取决于您的代码。

    我更喜欢在这里使用tryMap() 运算符,它可以让您检查响应对象,并可能将诸如 404 响应(这不是组合管道中的失败状态)之类的内容转换为失败。 之后,一种常见的模式是获取数据并将其运行到 .decode() 运算符中以获取结构化对象。

    然后您可以选择处理失败的方式 - 最常见的解决方案是使用 .catch() 将发布者的值替换为您希望显示的任何默认值。

    使用它的核心细节可能是这样的:

    let remoteDataPublisher = URLSession.shared.dataTaskPublisher(for: myURL!)
    .tryMap { data, response -> Data in 
                guard let httpResponse = response as? HTTPURLResponse, 
                    httpResponse.statusCode == 200 else { 
                        throw TestFailureCondition.invalidServerResponse 
                }
                return data 
    }
    .decode(type: PostmanEchoTimeStampCheckResponse.self, decoder: JSONDecoder())
    

    这是来自https://heckj.github.io/swiftui-notes/#patterns-datataskpublisher-trymap 的示例,是免费在线参考Using Combine 的一部分。

    (还有更多关于使用 catch() 处理来自https://heckj.github.io/swiftui-notes/#patterns-oneshot-error-handling 的 dataTaskPublisher 的错误的详细信息)

    【讨论】:

      【解决方案2】:

      这一行:

      URLSession.shared.dataTaskPublisher(for: urlRequest)
      

      给你一个发布者,Output(Data, URLResponse)Failure 类型为 URLError 的元组。

      在这个阶段你可以使用

      .mapError()
      

      如果您想将此值映射到您自己的错误类型或以某种方式处理它,您也可以选择忽略它并应用:

      .catch()
      

      在您的操作链结束时一次性处理所有错误(或忽略它们)。

      【讨论】:

        猜你喜欢
        • 2021-05-19
        • 1970-01-01
        • 2021-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-04
        相关资源
        最近更新 更多