ios - Alamofire 泛化请求
问题描述
我正在使用 Almofire 来处理我的所有请求并且工作正常。我需要知道如何概括所有请求以在一个地方处理所有错误。
func updateSettingValue(group : String , value: String , callback: @escaping (SettingsResponseModel) -> Void, errorCallback: @escaping (Error) ->Void)
{
let url = BASE_URL_PROD + API_SETTINGS
let settingsParams : Parameters = ["Setting" : group , "Tag" : value]
Alamofire.request(url, method: .put, parameters: settingsParams, headers: getHeader()).responseObject {
(response: DataResponse< SettingsResponseModel>) in
switch response.result {
case .success:
print("response \(response)")
DispatchQueue.main.async {
callback(response.result.value!)
}
break
case .failure(let error):
print(error)
errorCallback(error)
}
}
}
func releaseKeys(mKey: String ,callback: @escaping (ReleaseKeyModel) -> Void
, errorCallback: @escaping (Error) -> Void){
let url = BASE_URL_PROD + API_RELEASE_KEY
let params: Parameters = ["mKey" : mKey]
Alamofire.request(url, method: .delete, parameters: params, encoding: URLEncoding.default, headers: getHeader()).responseObject{
(response : DataResponse< ReleaseKeyModel >) in
print("releaseKey: \(response) ")
switch response.result {
case .success:
DispatchQueue.main.async {
callback(response.result.value!)
}
break
case .failure(let error):
print(error)
errorCallback(error)
}
}
}
我如何将其概括为在 DataResponse 中为 Mapping Model 类获取参数,这样我就不必为所有方法单独处理成功和失败情况。
解决方案
您可以将与服务器的工作分为 2 类:
1)类 RestClient
import Foundation
typealias responseBlock = (_ swiftObj: Any?, _ error: Error?) -> Void
class RestClient: NSObject {
static let shared = RestClient()
private var http = HttpService()
func updateSettingValue(group: String, value: String, resp: @escaping responseBlock) {
let url = BASE_URL_PROD + API_SETTINGS
let params = ["Setting": group, "Tag": value]
http.reque(url, method: .put, parameters: params, headers: getHeader(), resp: { (value, error) in
if let err = error {
return resp(nil, err)
}
guard let data = value else {
return resp(nil, error)
}
//your method for parse data
self.parseData(respData: data,
modelCls: SettingsResponseModel.self,
response: resp)
})
}
func releaseKeys(mKey: String, resp: @escaping responseBlock) {
let url = BASE_URL_PROD + API_RELEASE_KEY
let params = ["mKey": mKey]
http.reque(url, method: .delete, parameters: params, encoding: URLEncoding.default, headers: getHeader(), resp: { (value, error) in
if let err = error {
return resp(nil, err)
}
guard let data = value else {
return resp(nil, error)
}
//your method for parse data
self.parseData(respData: data,
modelCls: ReleaseKeyModel.self,
response: resp)
})
}
}
2)类HttpService
class HttpService {
func reque(_ url: URLConvertible,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
encoding: ParameterEncoding = URLEncoding.default,
headers: HTTPHeaders? = nil,
queue: QueueQos = .defaultQos,
resp: @escaping responseBlock) {
Alamofire.request(url,
method: method,
parameters: parameters,
encoding: encoding,
headers: headers
).responseObject (queue: queue) { (response) in
switch response.result {
case .success:
if let jsonResp = response.result.value {
//You can also check out some error messages at this place.
resp(jsonResp, nil)
}
case .failure(let error):
resp(nil, error)
}
}
}
}
推荐阅读
- sql-server - MS Access Passthrough 查询不返回记录
- mysql - 无论如何将单列数据显示到多列中
- java - Navigation Components: Switch Menu of Navigation Drawer (for logged in users)
- c# - IIS 请求计数限制与 IIS Express - Web API 核心
- python - 了解 scipy.integrate.odeint 中的时间步长
- javascript - 如何在 React 中禁用挂载时的初始悬停过渡?
- node.js - 如何将 Angular Universal 应用程序部署到 Node.js 生产服务器?
- java - Heroku 容器:释放抛出 UnhandledPromiseRejectionWarning:
- c - 为什么代码不是递归出来的?
- google-oauth - 与 Google 登录关联的帐户:有没有办法知道用户何时通过其 Google 帐户设置撤销/删除了访问权限?