You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Alamofire Promise实现API数据获取的泛型方法问询

改造泛型网络请求方法方案

没问题,我来帮你把这个Alamofire结合Promise的网络请求方法改成泛型版本,这样就能轻松支持任意符合Codable协议的数据类型解析了!

改造后的完整代码

import Alamofire
import PromiseKit

class Http {
    // 泛型方法,支持任意遵循Codable的模型类型
    class func asyncGetRequest<T: Codable>(url: String) -> Promise<T> {
        return Promise { resolve in
            Alamofire.request(url).responseData()
                .done { response in
                    // 尝试解码为指定的泛型类型T
                    do {
                        let decodedModel = try JSONDecoder().decode(T.self, from: response.data)
                        resolve.fulfill(decodedModel)
                    } catch {
                        // 解码失败时返回自定义错误,附带模型类型信息便于调试
                        let decodeError = MyError(message: "Error: Couldn't decode model of type \(T.self)")
                        resolve.reject(decodeError)
                    }
                }
                .catch { networkError in
                    // 捕获网络请求本身的错误(比如连接失败、状态码异常等)
                    resolve.reject(networkError)
                }
        }
    }
}

// 假设你的自定义错误类型定义如下(如果还没实现可以参考)
enum MyError: Error {
    case message(String)
}

关键改动说明

  • 泛型约束:给方法添加了<T: Codable>泛型参数,确保传入的模型类型必须遵循Codable协议——这是JSONDecoder能正常解析的核心前提。
  • 动态返回类型:方法返回类型从固定的Promise<List>改为Promise<T>,调用时会根据你传入的模型类型自动推断返回的Promise具体类型。
  • 可配置URL:把原代码中硬编码的GET_PROFFESSIONAL改成了方法参数url: String,让这个方法可以复用在不同的API请求端点上,灵活性大幅提升。
  • 优化解码逻辑:把原代码里的try?换成了do-catch结构,既能明确捕获解码错误,还能在错误信息里标注具体的模型类型,方便后续调试定位问题。
  • 完整错误传递:分别处理了网络请求错误和模型解码错误,确保两种类型的错误都能通过Promise的reject回调正确传递给调用方。

使用示例

假设你有User和Blog两个遵循Codable的模型,就可以这样调用泛型方法:

// 请求并解析User类型数据
Http.asyncGetRequest(url: "https://api.example.com/users")
    .done { userModel in
        // 处理User模型数据
        print("Fetched user: \(userModel)")
    }
    .catch { error in
        // 统一处理错误
        print("Request failed: \(error)")
    }

// 请求并解析Blog类型数据
Http.asyncGetRequest(url: "https://api.example.com/blogs")
    .done { blogModel in
        // 处理Blog模型数据
        print("Fetched blog: \(blogModel)")
    }
    .catch { error in
        // 统一处理错误
        print("Request failed: \(error)")
    }

内容的提问来源于stack exchange,提问作者Damodar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:31:34