iOS 闭包封装网络请求

本文使用语言为 Swift4

import UIKit
import Alamofire
import MBProgressHUD
import SwiftyJSON

//网络请求成功, 但是 code 码不为 0 时回调
protocol RequestSuccessProtocol: AnyObject {
    func todoSomething()
}

class HTTPRequestTool: NSObject {
    
    //创建网络请求单例
    static let defalut: HTTPRequestTool = {
        return HTTPRequestTool()
    }()
    //设为私有, 只能通过单例方法创建
    private override init() {}

    //代理
    weak var delegate: RequestSuccessProtocol?
    private var headers: HTTPHeaders?
    
    //将不变的 header 写入 defaultHTTPHeaders, 不用每次写
    func customHeaders(additionHeaders: HTTPHeaders) {
        var defalutHeader = SessionManager.defaultHTTPHeaders
        for (key, value) in additionHeaders {
            defalutHeader[key] = value
        }
        let configuration = URLSessionConfiguration.default
        configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
    }
    
    func doRequest(url: String, method: HTTPMethod, params: [String: Any]?, encode: JSONEncoding, completionHandler: @escaping (_ result: JSON) -> Void) {
        
        MBProgressHUD.showWait()
        DEBUGLog(message: "\(method), 请求 URL: \(url), 参数 Param: \(String.init(describing: params))")
        let request: DataRequest = Alamofire.request(url, method: method, parameters: params, encoding: encode, headers: headers)
        request.responseJSON { (response) in
            switch response.result {
            //请求成功
            case .success:
                MBProgressHUD.hideHUD()
                if let value = response.value {
                    let dataDic = JSON(value)
                    DEBUGLog(message: dataDic)
                    if let code = dataDic["code"].string {
                        if code == "0"{//成功返回数据
                            completionHandler(dataDic["data"])
                        }else if code == "7"{//约定的退出登录 code 码
                            //to do log out
                        }else{//服务器内部其它错误
                            if let message = dataDic["message"].string{
                                print(message)
                                //需要进行其它操作的 controller, 回调该方法
                                self.delegate?.todoSomething()
                            }
                        }
                    }
                }
            //请求失败
            case .failure(let error):
                MBProgressHUD.hideHUD()
                DEBUGLog(message: error)
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/leecsdn77/article/details/80682725