AlamoCodable 2.0.1

AlamoCodable 2.0.1

Umesh Verma 维护。



  • Umesh Verma

AlamoCodable

一个网络管理器,依赖于 Alamofire,它自动将 JSON 响应数据转换为使用 Codable 的 Swift 对象。

使用方法

给定一个返回以下格式的数据的 URL

{
    "total_count": 1,
    "incomplete_results": false,
    "items": [
        {
            "login": "umeshiscreative",
            "id": 36879900,
            "node_id": "MDQ6VXNlcjM2ODc5OTAw",
            "avatar_url": "https://avatars2.githubusercontent.com/u/36879900?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/umeshiscreative"
        }
    ]
}

您可以使用如下类

import AlamoCodable

let URL = "https://api.github.com/search/users?q=umeshiscreative"
        
let apiRequest = AlamoCodable(url: URL)
apiRequest.responseObject(UserModel.self){ result in
     switch result {
           case .success(let data):
                print("Sucess === \(data)")
           case .failure(let error):
                print("Error \(error)")
     }
}

如果您的数据响应是数组格式,则按以下方式操作

import AlamoCodable

let URL = "https://api.github.com/search/users?q=umeshiscreative"
        
let apiRequest = AlamoCodable(url: URL)
apiRequest.responseArray(UserModel.self){ result in
     switch result {
           case .success(let data):
                print("Sucess === \(data)")
           case .failure(let error):
                print("Error \(error)")
     }
}

完成处理程序中的 UserResponse 对象是您定义的自定义对象。对象必须遵循 Codable 协议。在上面的示例中,UserResponse 对象如下所示

struct UserModel: Codable {
    var incompleteResults: Bool? = nil
    var totalCount: Int?         = nil
    var items:[Items]?           = nil
    
    enum CodingKeys: String, CodingKey {
        case items
        case totalCount = "total_count"
        case incompleteResults = "incomplete_results"
    }
}

struct Items: Codable {
    var login:String?       = nil
    var id:Int?             = nil
    var nodeId:String?      = nil
    var avatarUrl:String?   = nil
    var gravatarId:String?  = nil
    var url:String?         = nil
    
    enum CodingKeys: String, CodingKey {
        case login
        case id
        case url
        case nodeId = "node_id"
        case avatarUrl = "avatar_url"
        case gravatarId = "gravatar_id"
    }
}
带有参数的 POST 请求
let parameters: Parameters = [
    "foo": "bar",
    "baz": ["a", 1],
    "qux": [
        "x": 1,
        "y": 2,
        "z": 3
    ]
]

let apiRequest = AlamoCodable(method: <HTTPMethod>, url: <String>, parameters: parameters, headers: <HTTPHeaders?>, encoding: <ParameterEncoding>)

apiRequest.responseObject(UserModel.self){ result in
     switch result {
           case .success(let data):
                print("Sucess === \(data)")
           case .failure(let error):
                print("Error \(error)")
     }
}
将响应对象数据保存到 Core Data
let URL = "https://api.github.com/search/users?q=umeshiscreative"
        
let apiRequest = AlamoCodable(url: URL)
apiRequest.responseObjectWithPersistence(UserDataEntity.self, 
                                         managedContext: <##Your Managed Context of Core Data##>){ result in
     switch result {
           case .success(let data):
                print("Sucessfully Data Saved in Core Data and Your Data is === \(data)")
           case .failure(let error):
                print("Error \(error)")
     }
}

完成处理程序中的 UserDataEntity 对象是您定义的自定义对象。对象必须遵循 NSManagedObjectCodable 协议。在上面的示例中,UserDataEntity 对象如下所示

public class UserDataEntity: NSManagedObject, Codable {
    
    @NSManaged public var incompleteResults: Bool
    @NSManaged public var totalCount: Int16
    
    enum CodingKeys: String, CodingKey {
        case totalCount = "total_count"
        case incompleteResults = "incomplete_results"
    }
    
    //MARK:- Required Codable Protocol Confirmation
    // MARK: - Decodable
    required convenience public init(from decoder: Decoder) throws {
    
        guard let codingUserInfoKeyManagedObjectContext = CodingUserInfoKey.managedObjectContext,
            let managedObjectContext = decoder.userInfo[codingUserInfoKeyManagedObjectContext] as? NSManagedObjectContext,
            let entity = NSEntityDescription.entity(forEntityName: "UserDataEntity", in: managedObjectContext) else {
                fatalError("Failed to decode UserDataEntity")
        }
        
        self.init(entity: entity, insertInto: managedObjectContext)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.incompleteResults = try container.decodeIfPresent(Bool.self, forKey: .incompleteResults) ?? false
        self.totalCount = try container.decodeIfPresent(Int16.self, forKey: .totalCount) ?? 0
    }
    
    // MARK: - Encodable
    public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(incompleteResults, forKey: .incompleteResults)
        try container.encode(totalCount, forKey: .totalCount)
    }
}

安装

可以使用 CocoaPods 将 AlamoCodable 添加到您的项目中,具体操作是在您的 Podfile 中添加以下行:

pod 'AlamoCodable', '~> 1.1.0'

贡献

欢迎贡献力量👍😃.

在提交任何拉取请求之前,请确保您已运行了包含的测试并用已通过。如果您包括新的功能。

鸣谢

Alamofire, ObjectMapper, AlamofireObjectMapper