gpt4 book ai didi

ios - 如果 dataTaskPublisher 有非零数据,那么错误类型是什么?

转载 作者:行者123 更新时间:2023-11-28 23:25:49 24 4
gpt4 key购买 nike

之前

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

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

URLSession.shared.dataTaskPublisher(for: urlRequest)

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

最佳答案

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

我更喜欢在这里使用 tryMap() 运算符,它可以让您检查响应对象,并可能转换 404 响应之类的东西(这不是 Combine 管道中的失败状态)陷入失败。之后,一种常见的模式是获取数据并将其运行到 .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 的错误的详细信息)

关于ios - 如果 dataTaskPublisher 有非零数据,那么错误类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58810262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com