gpt4 book ai didi

swift - 处理 Combine 错误的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-28 13:26:41 25 4
gpt4 key购买 nike

我正在尝试使用以下代码将下载的 JSON 解码为结构。

static func request(url: URL) -> AnyPublisher<SomeDecodableStruct, Error> {
return URLSession.shared.dataTaskPublisher(for: url)
.map { $0.data }
.decode(type: SomeDecodableStruct.self, decoder: JSONDecoder())
.eraseToAnyPublisher()
}

但是,如果处理失败,我希望您返回请求处理失败或解码处理失败的信息。因此,我定义了符合 Error 协议(protocol)的 FailureReason 枚举,如下所示。

enum FailureReason : Error {
case sessionFailed(error: URLError)
case decodingFailed
}

static func request(url: URL) -> AnyPublisher<SomeDecodableStruct, FailureReason> {
// ???
}

如何定义满足此 FailureReasonrequest(url:)

最佳答案

Combine 在错误方面是强类型的,因此您必须使用 mapError 将错误转换为正确的类型,或者像 RxSwift 那样草率地将所有内容衰减为 Error

enum NetworkService {
enum FailureReason : Error {
case sessionFailed(error: URLError)
case decodingFailed
case other(Error)
}

static func request<SomeDecodable: Decodable>(url: URL) -> AnyPublisher<SomeDecodable, FailureReason> {
return URLSession.shared.dataTaskPublisher(for: url)
.map(\.data)
.decode(type: SomeDecodable.self, decoder: JSONDecoder())
.mapError({ error in
switch error {
case is Swift.DecodingError:
return .decodingFailed
case let urlError as URLError:
return .sessionFailed(error: urlError)
default:
return .other(error)
}
})
.eraseToAnyPublisher()
}
}

关于swift - 处理 Combine 错误的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58251478/

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