PromiseKit+OMGHTTPURLRQ+Codable+泛型 - 让请求更加清爽清晰
可以通过cocoapods进行安装,或者去GitHub上下载
pod 'PromiseKit'
pod 'PromiseKit/OMGHTTPURLRQ'
然后对Promise进行下常用的扩展
extension Promise where T == (data: Data, response: URLResponse) {
func asObject<T: Codable>() -> Promise<T> {
return map {
try JSONDecoder().decode(T.self, from: $0.data)
// ... 可针对返回的结果提前进行处理 - 比如网络错误之类、登录失效跳转之类等
// $0.data 、 $0.response
// let res = try? JSONDecoder().decode(Result<T>.self, from: $0.data)
// let code = res?.code
// let data = res?.data
// ....
}
}
}
使用例子:
一般后台的返回结果
{
"code": 0,
"message": "登录成功",
"data": {
"object":$object
}
}
data 可能有三种情况 ①对象{} ②数组[] ③空nil
所以可以声明个最基本的模型,再用泛型处理data那个未知类型
struct Result<T: Codable>:Codable {
var code: Int
var message: String
var data: T?
}
struct EmprtyData:Codable { }
struct ObjectData:Codable {
var useranme: String
var userId: Int
//...
}
struct ArrayData:Codable {
var id: Int
var avatar: String
//...
}
Promise<Result<EmprtyData>> // data 为空时候
Promise<Result<ObjectData>> // data 为对象时候
Promise<Result<[ArrayData]>> // data 为数组时候
实际操作事例
struct UserModuleAPI {
static func register(obj: RegisterObj) -> Promise<Result<EmprtyData>> {
let json = obj.toDictionary()
return URLSession.shared.POST(NetWorks.api + "/v3/user/register", json: json).asObject()
}
static func getUserInfo(userid: Int) -> Promise<Result<ObjectData>> {
return URLSession.shared.GET(NetWorks.api + "/v3/user/\(userid)").asObject()
}
static func getFriendsList(userid: Int) -> Promise<Result<[ArrayData]>> {
return URLSession.shared.GET(NetWorks.api + "/v3/user/friends/\(userid)").asObject()
}
// ...
}
使用例子
override func viewDidLoad() {
super.viewDidLoad()
UserModuleAPI.getFriendsList(userid: 123456).done { res in
print(res.code)
print(res.message)
guard let data = res.data else { return }
print(data)
}.ensure {
print("always")
}.catch { print($0) }
}
如果后台数据比较规范的话,可以移步到这里来
https://www.jianshu.com/p/1d13d4b38a17