前言:
第三方库提供的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)")
}
|