使用管理器会话配置设置默认的baseURLString

时间:2015-05-23 20:02:01

标签: swift alamofire

我正在使用swift与Alamofire库开发IOS应用程序。下面描述了我的网络模型的两个文件,第一个是带有Alamofire管理器会话配置的ApiClient类和2个服务实例,在我的问题中我只描述了一个Service1结构,在这个结构中我和#39;使用Alamofire路由器请求REST API,我想知道,如何使用管理器会话配置设置默认的baseURLString(" https://api.com/v1")?而不是在每个struct Service中声明它。

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

    }


}

1 个答案:

答案 0 :(得分:2)

我认为有很多方法可以做到这一点。以下是一些想法......

  1. baseURLString存储在APIClient中,并将值传递给每个Service初始值设定项
  2. 创建一个BaseService类,您可以在其中存储服务之间的所有常见信息类型,例如baseURLString,其他标题等。
  3. baseURLString中公开APIClient,并将APIClient的弱引用传递给每项服务。
  4. 创建一个单独的对象,例如AppEnvironment,用于存储可以通过全局单例或类属性访问的OAuth信息,baseURLString等属性。
  5. 还有很多方法。希望其中一个想法能激发你的想象力。