【问题标题】:Alamofire+Combine: how to get custom error type out of AFErrorAlamofire+Combine:如何从 AFError 中获取自定义错误类型
【发布时间】:2020-09-09 06:47:26
【问题描述】:

我正在使用 Alamofire 及其组合助手来执行简单的网络请求,如下所示:

class AlamofireClient {
    func getData<T: Decodable>(request: URLRequestConvertible) -> AnyPublisher<T, APIError> {
         AF.request(request)
            .validate()
            .publishDecodable(type: T.self)
            .value()
            .mapError(APIError.init(error:))
            .eraseToAnyPublisher()
    }
}

enum APIError: Error {
    init(error: AFError) {
        self = .network
    }
    
    case network
    case custom(Int, String, String)
    
    var message: String {
        switch self {
        case .network:
            return "Network Error"
        case .custom(let code, let message, let technicalMessage):
            return "Custom error info are: \(code) -- \(message) -- \(technicalMessage)"
        }
    }
}

我一直在提取从服务器返回的自定义错误信息,在我的例子中,它有 3 项:代码、消息和技术消息。

【问题讨论】:

  • “卡住”是什么意思?究竟是什么问题?
  • 执行请求得到什么响应?我的猜测是您的服务器返回的状态代码超出了 Alamofire 中的默认验证。您可以在 Alamofire 中为请求设置可接受的状态代码。
  • ¿您找到解决方案了吗?我也“卡”在相同的代码上。
  • @Andreybeta 我最终删除了 Alamofire 并使用了比 Alamofire 更灵活的 URLSession

标签: ios swift alamofire combine


【解决方案1】:

所以我曾经历过类似的情况,我想传递自己的错误,而不是 Alamofire。请参阅我使用的以下代码实现,它对我有用。希望它也会对某些人有所帮助。

 public func request<T>(response: @escaping (AnyPublisher<T, MyNetworkError>) -> ()) where T : Decodable {
        response(
        MyNetwork.shared.sendRequest(path: “sample/url/endpoints”)
            .validate()
            .publishDecodable(type: T.self)
            .value()
            .mapError{MyNetworkError.networkError(error: ($0 as Error))}
            .eraseToAnyPublisher())
    }

虽然我自己的错误如下所示。

public enum MyNetworkError: Error {
    case networkError(error: Error)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多