基于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
相关产品推荐
相关产品推荐

