0
我正在開發一個使用Alamofire庫的Swift IOS應用程序。我的網絡模型的兩個文件在下面描述,第一個是ApiClient類,帶有Alamofire管理器會話配置和兩個服務實例,在我的問題中,我只描述了一個,Service1結構,在這個結構中我是使用Alamofire路由器請求REST API,並且我想知道,如何使用管理器會話配置來設置默認的baseURLString(「https://api.com/v1」)?而不是在每個struct Service中聲明它。使用管理器會話配置設置默認的baseURLString
ApiClient.swift
class ApiClient {
var OAuthToken = "ZMpMDJhB0egjFIzFhapuWNFSBhX2conQ1e+3vlv0XrJQVcw7fRg=="
var service1: Service1
var service2: Service2
init() {
let manager = Manager.sharedInstance
manager.session.configuration.HTTPAdditionalHeaders = [
"Authorization": "Bearer \(OAuthToken)"
]
service1 = Service1()
service2 = Service2()
}
}
Service1.swift
struct Service1 {
enum Router: URLRequestConvertible {
static let baseURLString = "https://api.com/v1"
case GetList([String: AnyObject])
case GetById(String)
case Add([String: AnyObject])
case Update(String, [String: AnyObject])
case Delete(String)
case GetListFromPoint([String: AnyObject])
var method: Alamofire.Method {
switch self {
case .GetList:
return .GET
case .GetById:
return .GET
case .Add:
return .POST
case .Update:
return .PUT
case .Delete:
return .DELETE
case .GetListFromPoint:
return .GET
}
}
var path: String {
switch self {
case .GetList:
return "/endPoint"
case .GetById(let id):
return "/endPoint/\(id)"
case .Add:
return "/endPoint"
case .Update(let id, _):
return "/endPoint/\(id)"
case .Delete(let id):
return "/endPoint/\(id)"
case .GetListFromPoint:
return "/near/endPoint"
}
}
var URLRequest: NSURLRequest {
let URL = NSURL(string: Router.baseURLString)!
let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))
mutableURLRequest.HTTPMethod = method.rawValue
switch self {
case .GetList(let parameters):
return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0
case .Add(let parameters):
return Alamofire.ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0
case .Update(_, let parameters):
return Alamofire.ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0
case .GetListFromPoint(let parameters):
return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0
default:
return mutableURLRequest
}
}
}
func getList(completionHandler: ([Object1]?, NSError?) ->()) {
Alamofire.request(Router.GetList(["skip": 0, "limit": 100])).responseJSON { (request, response, json, error) in
//Converting json to object
}
func getById(completionHandler: ([Object1]?, NSError?) ->()) {
Alamofire.request(Router.GetById(id)).responseJSON { (request, response, json, error) in
//Converting json to object
}
}
感謝這些想法cnoon,但我的目標是服務一定不知道關於APIClient的任何事情,如果我通過引用傳遞URL,單例...我必須在每個服務 - > ApiClient.Url中實例化它。如果我錯了,請糾正我。 – Edu
那麼你問的原始問題的答案是否定的,你不能使用會話管理器配置來設置'baseURLString'。它不支持基本URL的想法。因此,您需要使用繼承,全局值,依賴注入等,以確保您的「服務」對象可以訪問基本URL。最簡單的解決方案是通過創建一個'BaseService'來設置'baseURL'來使用繼承,所有其他'Service'子類將自動繼承它。 – cnoon