请稍侯

moya结合codable的应用

22 May 2023

Moya结合Codable的应用

首先,需要在请求的模型类中实现 Codable 协议。假设我们有一个名为 DataModel 的模型类,包含 idname 两个属性,可以这样定义:

struct DataModel: Codable {
    var id: Int
    var name: String
}

接着,在网络请求的文件中,定义请求目标并创建 MoyaProvider 对象:

import Moya

// 定义请求目标
enum RequestTarget {
    case getData // 获取数据
}

// 创建 MoyaProvider 对象
let provider = MoyaProvider<RequestTarget>()

然后,在发送网络请求时,使用 .request 方法来发送请求,并在回调中处理返回的数据。由于我们的模型类实现了 Codable 协议,因此可以直接使用 .decode() 方法将返回的 JSON 数据转换为模型对象。

// 发送网络请求
provider.request(.getData) { result in
    switch result {
    case let .success(response):
        do {
            // 将返回的 JSON 数据转换为 DataModel 数组
            let data = try response.map([DataModel].self)
            print(data)
        } catch {
            print(error.localizedDescription)
        }
    case let .failure(error):
        print(error.localizedDescription)
    }
}

上面的代码中,我们使用 .map() 方法将返回的 JSON 数据转换为 [DataModel] 类型的数组,如果返回的是单个模型对象,则使用 .map(DataModel.self)。如果解析失败,则使用 .catch() 方法捕获异常并打印错误信息。

需要注意的是,如果返回的 JSON 数据中包含了一些不在模型类中定义的字段,可以使用 CodingKeys 来进行映射。例如:

struct DataModel: Codable {
    var id: Int
    var name: String
    
    // 定义 CodingKeys
    enum CodingKeys: String, CodingKey {
        case id
        case name = "user_name" // 将 JSON 中的 "user_name" 映射到模型类的 "name" 属性上
    }
}

这样就可以将 JSON 中的 user_name 映射到模型类的 name 属性上了。