美文网首页
PromiseKit+OMGHTTPURLRQ+Codable+

PromiseKit+OMGHTTPURLRQ+Codable+

作者: 小黑Swift | 来源:发表于2018-12-04 22:26 被阅读28次

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

相关文章

网友评论

      本文标题:PromiseKit+OMGHTTPURLRQ+Codable+

      本文链接:https://www.haomeiwen.com/subject/xmxbcqtx.html