简单封装Alamofire

前言:

第三方库提供的API有时候并不能直接提供在项目里面直接调用,为了避免第三方库的不稳定性带来的影响,将其封装使用是个很好的做法。类似于JPA或MyBatis这样的“三层架构”实际上可以变换思路改成封装第三方库的做法,下面是一个利用协议和闭包简易封装的Alamofire做法,过程非常简单。

协议层:

协议层定义两个待实现的方法,一个为get请求,一个为post请求。当然,必要的数参数和闭包(数据请求完后将其回调出)也是具备的。内容如下:

import Foundation
import SwiftyJSON

protocol NetworkUtil {
	// 均使用逃逸闭包来将请求结果回调出
    static func postRequest(URLString: String, parameters : [String : Any]?, callback: @escaping (_ result: Any) -> ())
    static func getRequest(URLString: String, parameters : [String : Any]?,callback: @escaping (_ result: Any) -> ())
}

Alamofire层:

相当于数据库连接池的部分(比喻不太恰当,但可以这样理解),该层只用来接受参数和发出参数,和具体的业务逻辑没有任何关系。

import Foundation
import Alamofire

enum MethodType {
    case get
    case post
}

class AlamofireLayer{
    class func requestData(_ type : MethodType, URLString : String, parameters : [String : Any]? = nil, finishedCallback :  @escaping (_ result : Any) -> ()) {
        
        let method = type == .get ? HTTPMethod.get : HTTPMethod.post
        
        Alamofire.AF.request(URLString, method: method, parameters: parameters).responseJSON { (response) in
               
            switch response.result {
            case .success(let json):
                finishedCallback(json)
                break
            case .failure(let error):
                print("error:\(error)")
                break
            }
            
        }
    }

}

实现层:

实现层就是具体实现协议的层次,这里就是针对具体业务逻辑而对接的方法。

import Foundation
import SwiftyJSON

class NetworkImpl: NetworkUtil{
    
    static func getRequest(URLString: String, parameters: [String : Any]?, callback: @escaping (Any) -> ()) {
        AlamofireLayer.requestData(MethodType.get, URLString: URLString, parameters: parameters) { result in
            callback(result)
        }
    }
    
    public static func postRequest(URLString: String, parameters: [String : Any]?, callback: @escaping (Any) -> ()) {
        AlamofireLayer.requestData(MethodType.post, URLString: URLString, parameters: parameters) { result in
            callback(result)
        }
    }
  
}

调用:

调用一般是在Controller层里面进行,如下文看到的,我们进行的网络请求实际上和Alamofire没有任何关系,假设我们要切换到Moya,更改实现层的内容即可,而不必在Controller层里面更改所有的请求部分。

        let url = "https://itunes.apple.com/lookup?"
        NetworkImpl.getRequest(URLString: url, parameters: ["id": requestTrackId!]) { (response) in
            let jsonData = JSON(response)
            
            print("------> RAW DATA:\(jsonData)")

        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值