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
对象是您定义的自定义对象。对象必须遵循 NSManagedObject
,Codable
协议。在上面的示例中,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'
贡献
欢迎贡献力量
在提交任何拉取请求之前,请确保您已运行了包含的测试并用已通过。如果您包括新的功能。