2015-05-23 42 views
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 

    } 


} 

回答

2

我認爲有很多方法可以做到這一點。這裏有一些想法...

  1. Store中APIClientbaseURLString和傳遞值到每個Service初始化的
  2. 創建BaseService類您存儲的服務,如之間的所有常用的信息, baseURLString,附加頭,等等
  3. 暴露在APIClientbaseURLString並傳遞APIClient的弱引用到每個服務。
  4. 創建一個單獨的對象,如AppEnvironment,其存儲諸如OAuth信息,baseURLString等可以通過全局單例或類屬性訪問的屬性。

還有更多的方法。希望這些想法中的一個能激發你的想象力。

+0

感謝這些想法cnoon,但我的目標是服務一定不知道關於APIClient的任何事情,如果我通過引用傳遞URL,單例...我必須在每個服務 - > ApiClient.Url中實例化它。如果我錯了,請糾正我。 – Edu

+1

那麼你問的原始問題的答案是否定的,你不能使用會話管理器配置來設置'baseURLString'。它不支持基本URL的想法。因此,您需要使用繼承,全局值,依賴注入等,以確保您的「服務」對象可以訪問基本URL。最簡單的解決方案是通過創建一個'BaseService'來設置'baseURL'來使用繼承,所有其他'Service'子類將自動繼承它。 – cnoon